如何在Flutter中发送带有附件的邮件?

时间:2018-08-02 12:52:30

标签: dart flutter

我找到了名为mailer3的dart插件:“ ^ 1.1.9”。以前,我在移动临时目录中创建映像。在Flutter移动应用程序中,我尝试使用mailer3插件作为邮件发送此保存的图片。邮件到达目的地,我没有收到错误消息,但似乎丢失了附件。

在dart中效果很好,并且还发送附件。在flutter中,我可以使用temp目录在应用程序中显示图像,但无法附加到邮件。

图像位置在设备的temp文件夹中:

  • '/ data / user / 0 / com.myApp.myApp / app_flutter / 20180700087.jpg'

我可以使用以下代码显示图像:

  • 新FileImage(File('$ newDekontImage'),

错误:

E/flutter (21184): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (21184): FileSystemException: Cannot open file, path = '/data/user/0/com.myApp.myApp/app_flutter/20180700087.jpg' (OS Error: No such file or directory, errno = 2)

如何在Flutter中发送带有此问题提供的信息的带有附件的邮件?

Flutter代码:

// TODO: SEND MAIL
void _sendMail() async {
  if (!_formKey.currentState.validate()) {
    return;
  } else {
    _formKey.currentState.save();

    var _options = new GmailSmtpOptions()
    ..username = “mymailaddress@gmail.com"
    ..password = “myPassword”;

    var _emailTransport = new SmtpTransport(_options);
    var _envelope = new Envelope()
    ..from = "mymailaddress@gmail.com"
    ..recipients.add(_receiverMailAddress)
      ..subject = "${_userDekontDetails[0][0].toString()} - Receipt”
      ..attachments.add(await new Attachment(file: await new File('$newDekontImage')))
      ..text = "${_userDekontDetails[0][0].toString()} - Receipt"
      ..html = '<h3>${_userDekontDetails[0][0].toString()} Receipt.</h3>'
          '<p>Hi, registered under my name, I am sending the receipt (${widget._currentUserReceiptNo}) with attached to this mail.</p>'
          '<p></p>'
          '<h5>Regards, </br></h5>'
          '${_userDekontDetails[0][0].toString()}';

    _emailTransport.send(_envelope)
      ..then((envelope) => print('Email sent'))
      ..catchError((e) => print('Error occured: $e'));
  }
}

2 个答案:

答案 0 :(得分:0)

在撰写本文时,mailer3 插件已经过时,mailer 是用于发送电子邮件的最新插件。 mailer 插件目前包含 mailer2 和 mailer3 的重要修复。我建议选择使用 mailer 包而不是 mailer3。

这是从 mailer3 到 mailer 的代码片段的移植

_sendMail(String username, String accessToken) async {
  // Read https://pub.dev/documentation/mailer/latest/smtp_server_gmail/gmailSaslXoauth2.html
  var _emailTransport = gmailSaslXoauth2(username, accessToken);

  var _envelope = new Message()
    ..from = "mymailaddress@gmail.com"
    ..recipients.add("recepient@gmail.com")
    ..subject = '{EMAIL_SUBJECT_GOES_HERE}'
    // Read https://pub.dev/documentation/mailer/latest/mailer/FileAttachment-class.html
    ..attachments
        .add(FileAttachment(File('{FILE_PATH}')))
    ..text = '{PLAIN_TEXT_GOES_HERE}'
    ..html = '{HTML_CONTENT_GOES_HERE}';

  send(_envelope, _emailTransport)
    ..then((envelope) => print('Email sent'))
    ..catchError((e) => print('Error occured: $e'));
}

答案 1 :(得分:0)

我用过 enough_mail,希望能帮到你。

MessageBuilder messageBuilder = MessageBuilder();

Future<bool> onFileSelect(BuildContext context) async {
    final result = await FilePicker.platform
        .pickFiles(type: FileType.any, allowMultiple: true, withData: true);
    if (result == null) {
      return false;
    }
    for (final file in result.files) {
      final lastDotIndex = file.path.lastIndexOf('.');
      MediaType mediaType;
      if (lastDotIndex == -1 || lastDotIndex == file.path.length - 1) {
        mediaType = MediaType.fromSubtype(MediaSubtype.applicationOctetStream);
      } else {
        final ext = file.path.substring(lastDotIndex + 1);
        mediaType = MediaType.guessFromFileExtension(ext);
      }
      messageBuilder.addBinary(file.bytes, mediaType, filename: file.name);
    }
    return true;
}

Future<void> sendMail(BuildContext buildContext) async {

    setState(() {
      needToFreezeUi = true;
    });

    MySnackBar.show(buildContext, MySnackBar.loadingIcon, "Please wait...!");
    
    SmtpClient smtpClient = SmtpClient(domain, isLogEnabled: true);
    try {
      await smtpClient.connectToServer(
        "$serverPrefix.${userInfo.domainName}",
        smtpServerPort,
        isSecure: isSmtpServerSecure
      );
      await smtpClient.ehlo();
      await smtpClient.authenticate(userInfo.email, userInfo.password);
      messageBuilder.from = [MailAddress('', userInfo.email)];
      messageBuilder.to = [MailAddress('', toTextEditCtl.text)];
      messageBuilder.cc = selectedCCEmailInfos.map((e) => MailAddress('',e.emailAddress)).toList();
      messageBuilder.bcc = selectedBCCEmailInfos.map((e) => MailAddress('',e.emailAddress)).toList();
      messageBuilder.subject = subjectTextEditCtl.text;
      String htmlText = await htmlEditorController.getText();
      messageBuilder.addTextHtml(htmlText);

      messageBuilder.hasAttachments ? messageBuilder.getPart(
          MediaSubtype.multipartAlternative,
          recursive: false
      ) : messageBuilder.addPart(
          mediaSubtype: MediaSubtype.multipartAlternative,
          insert: true
      );

      if (!messageBuilder.hasAttachments) {
        messageBuilder.setContentType(
            MediaType.fromSubtype(MediaSubtype.multipartAlternative)
        );
      }

      MimeMessage mimeMessage = messageBuilder.buildMimeMessage();
      SmtpResponse smtpResponse = await smtpClient.sendMessage(mimeMessage);

      MySnackBar.hide(buildContext);
      if(smtpResponse.isOkStatus){
        MySnackBar.show(buildContext,MySnackBar.successIcon,"Mail send successfully");
        clearInputFields(buildContext);
      }else {
        MySnackBar.show(buildContext,MySnackBar.errorIcon,"Something went wrong, please try again!");
      }
      
    } on SmtpException catch (e) {
      MySnackBar.show(buildContext,MySnackBar.errorIcon,"Something went wrong, please try again!");
    }
    setState(() {
      needToFreezeUi = false;
    });
}

==============================

dependencies:
  enough_mail: ^1.3.4
  html_editor_enhanced: ^1.4.0
  file_picker: ^3.0.2+2