[译]Flutter发送邮件插件flutter_mailer

1,767 阅读1分钟

本文翻译自 flutter_mailer | Flutter Package (pub.dev)

感觉作者[示例 APP]的链接和[邮件选项]的链接整反了。

pub的示例要在 iOS 上正常运行的话,需要设置下面的内容:

Info.plist

<key>NSPhotoLibraryUsageDescription</key>
<string>需要您的授权才能访问图片库</string>
<key>NSCameraUsageDescription</key>
<string>需要您的授权才能访问相机</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要您的授权才能访问麦克风</string>

这是 image_picker | Flutter Package (pub.dev) (中文) 需要的权限。


通过设备的邮件客户端来共享邮件内容 - 支持多附件。

在移动端开发中,跨应用共享邮件域数据的简单快捷的插件。

示例 APP

支持

  • Android
  • iOS

开始

添加 pubspec 依赖,如下:

dependencies:
  flutter:
    sdk: flutter
  flutter_mailer: ^2.0.0

具体的邮件选项如下

发送邮件

import 'package:flutter_mailer/flutter_mailer.dart';

...
...

final MailOptions mailOptions = MailOptions(
  body: 'a long body for the email <br> with a subset of HTML',
  subject: 'the Email Subject',
  recipients: ['example@example.com'],
  isHTML: true,
  bccRecipients: ['other@example.com'],
  ccRecipients: ['third@example.com'],
  attachments: [ 'path/to/image.png', ],
);

final MailerResponse response = await FlutterMailer.send(mailOptions);
switch (response) {
  case MailerResponse.saved: /// ios only
    platformResponse = 'mail was saved to draft';
    break;
  case MailerResponse.sent: /// ios only
    platformResponse = 'mail was sent';
    break;
  case MailerResponse.cancelled: /// ios only
    platformResponse = 'mail was cancelled';
    break;
  case MailerResponse.android:
    platformResponse = 'intent was successful';
    break;
  default:
    platformResponse = 'unknown';
    break;
}

gmail 和其它 APP 可能 会在外部解析 HTML。

[Android]检查邮件客户端是否已安装

如果想要向指定的邮件 APP 发送 intent , 需要设置邮件选项(appSchema)。( isAppInstalled() ) 在 [iOS] 上返回 false

const GMAIL_SCHEMA = 'com.google.android.gm';

final bool gmailinstalled =  await isAppInstalled(GMAIL_SCHEMA);

if(gmailinstalled) {
  final MailOptions mailOptions = MailOptions(
    body: 'a long body for the email <br> with a subset of HTML',
    subject: 'the Email Subject',
    recipients: ['example@example.com'],
    isHTML: true,
    bccRecipients: ['other@example.com'],
    ccRecipients: ['third@example.com'],
    attachments: [ 'path/to/image.png', ],
    appSchema: GMAIL_SCHEMA,
  );
  await FlutterMailer.send(mailOptions);
}

[iOS] 检查设备是否有能力发送邮件

该包在 [iOS] 上使用 MFMailComposeViewController ,它需要默认的邮件 APP 。如果没有安装,可能需要转为使用 url_launcher 。 ( canSendMail() ) 在 [Android] 上返回 false



  final bool canSend = await canSendMail();

  if(!canSend && Platform.isIos) {
    final url = 'mailto:$recipient?body=$body&subject=$subject';
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }
}

该包基于 react-native-mail