在 Flutter 中将 pdf 附件发送到电子邮件中

问题描述 投票:0回答:3

我需要发送一封电子邮件并附上生成的 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,将其附加到电子邮件中,然后发送。

flutter dart email
3个回答
1
投票

正如您所提到的,您可以生成 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),
      ),
    );
  }

1
投票

注意 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();

0
投票

如果您尝试打开内置邮件应用程序,并预先填充收件人和附件,则可以使用 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,
  );
© www.soinside.com 2019 - 2024. All rights reserved.