我需要发送一封电子邮件并附上生成的 pdf。
现在,我成功生成了 pdf,并且可以将它们保存到手机内存中,为此我遵循这篇文章:将 Flutter 应用程序屏幕导出为 PDF
但现在我想自动将其附加到电子邮件并发送。根据该帖子中的信息,这是不可能的。因为它会引导我进入一个屏幕,我必须在其中选择 pdf 参数和 pdf 名称。
这是我用来生成 PDF 的代码:
void printScreen() {
Printing.layoutPdf(onLayout: (PdfPageFormat format) async {
final doc = pw.Document();
final image = await WidgetWraper.fromKey(
key: printKey,
pixelRatio: 2.0,
);
doc.addPage(pw.Page(
pageFormat: format,
build: (pw.Context context) {
return pw.Center(
child: pw.Expanded(
child: pw.Image(image),
),
);
}));
return doc.save();
});
}
要发送电子邮件,我正在阅读Flutter电子邮件发送器包的文档但我不知道如何使用预定义名称自动生成PDF,将其附加到电子邮件中,然后发送。
正如您所提到的,您可以生成 PDF 并将其保存在手机内存中,现在您只需在电子邮件构造函数中传递附件路径(保存附件文件的位置),如下所示。
完整的Send方法代码。
Future<void> send() async {
final Email email = Email(
body: _bodyController.text,
subject: _subjectController.text,
recipients: [_recipientController.text],
attachmentPaths: attachments,
isHTML: isHTML,
);
String platformResponse;
try {
await FlutterEmailSender.send(email);
platformResponse = 'success';
} catch (error) {
print(error);
platformResponse = error.toString();
}
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(platformResponse),
),
);
}
注意 Firebase 大小限制在 2MB 左右,
pdf.addPage(
// Page Ayarları
pw.MultiPage(
maxPages: 100,
theme: pw.ThemeData.withFont(
base: await PdfGoogleFonts.openSansRegular(),
bold: await PdfGoogleFonts.openSansBold(),
icons: await PdfGoogleFonts.materialIcons(), // this line
),
pageFormat: format,
orientation: pw.PageOrientation.portrait,
crossAxisAlignment: pw.CrossAxisAlignment.start,
build: (context) {
return FinalPDF;
}),
);
final data = await pdf.save();
var base64data = base64Encode(data).toString();
await FirebaseFirestore.instance.collection("mail").doc().set({
"to": "[email protected]",
"message": {
"subject": "*****",
"html": "This is an <code>HTML</code> email body.",
"attachments": [
{
"filename": "denem.PDF",
"content": base64data,
"encoding": "base64",
}
],
},
});
return pdf.save();
如果您尝试打开内置邮件应用程序,并预先填充收件人和附件,则可以使用 mail_sender。
我们构建这个插件是为了适应我们在一个应用程序中的用例,在该应用程序中,我们必须打开一个本机邮件应用程序,并从内部存储中获取附件。
final _mailSenderPlugin = MailSender();
_mailSenderPlugin.sendMail(
recipient: ["[email protected]", "[email protected]"],
subject: "Leave Application",
body: "Some lengthy Body text",
bcc: ["[email protected]"],
cc: ["[email protected]", "[email protected]"],
attachment: targetFile.path,
);