Flutter邮件发送插件open_mail的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter邮件发送插件open_mail的使用

Open Mail

Flutter 3.24.4 pub package

Open Mail 是一个Flutter包,旨在简化查询设备上已安装的电子邮件应用程序的过程,并允许用户打开他们选择的电子邮件应用程序。对于希望为用户提供更多控制权以选择使用哪个电子邮件应用程序的开发者来说,这个包非常有用,不像url_launcher,它通常只打开默认的电子邮件应用程序。

如果你只是想编写一封电子邮件或打开带有mailto:链接的应用程序,你应该寻找url_launcher

这个Flutter包让用户可以轻松地打开他们已安装的邮件应用。它受到类似包(特别是open_mail_app)的启发,并在此基础上进行了改进,提供了更优化和精简的体验。

为什么使用Open Mail?

  • url_launcher允许你打开mailto:链接,但它不允许你:
    • 选择特定的电子邮件应用程序。
    • 查询可用的电子邮件应用程序列表。
  • 在iOS上,url_launcher将始终打开默认的Mail App,即使用户更喜欢其他应用程序,如Gmail或Outlook。
  • 使用Open Mail,你可以:
    • 识别所有已安装的电子邮件应用程序。
    • 如果有多个选项可用,允许用户选择他们首选的电子邮件应用程序。

设置

Android

对于Android,不需要额外的配置。该包可以直接使用。

iOS 配置

对于iOS,你需要在你的Info.plist文件中列出你想要查询的电子邮件应用程序的URL方案。添加以下代码:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlegmail</string>
    <string>x-dispatch</string>
    <string>readdle-spark</string>
    <string>airmail</string>
    <string>ms-outlook</string>
    <string>ymail</string>
    <string>fastmail</string>
    <string>superhuman</string>
    <string>protonmail</string>
</array>

请随意在GitHub上提交问题,以添加更多你希望支持的流行电子邮件应用程序。这些应用程序必须同时添加到你的应用程序的Info.plist和此库的源代码中。

安装

在你的pubspec.yaml中添加以下内容:

dependencies:
  open_mail: latest_version

然后,运行以下命令:

flutter pub get

使用方法

打开邮件应用(如果有多个应用可用,则显示选择器)

下面是一个完整的使用示例:

import 'package:flutter/material.dart';
import 'package:open_mail/open_mail.dart';

void main() {
  runApp(const MaterialApp(home: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Open Mail Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            // Button to open a mail app
            ElevatedButton(
              child: const Text("Open Mail App"),
              onPressed: () async {
                // Try to open the mail app
                var result = await OpenMail.openMailApp(
                  nativePickerTitle: 'Select email app to open',
                );

                // If no mail apps are installed
                if (!result.didOpen && !result.canOpen) {
                  showNoMailAppsDialog(context);
                }
                // If multiple mail apps are available on iOS, show a picker
                else if (!result.didOpen && result.canOpen) {
                  showDialog(
                    context: context,
                    builder: (_) {
                      return MailAppPickerDialog(
                        mailApps: result.options,
                      );
                    },
                  );
                }
              },
            ),

            // Button to compose an email in the mail app
            ElevatedButton(
              child: const Text('Open mail app, with email already composed'),
              onPressed: () async {
                // Define the content of the email
                EmailContent email = EmailContent(
                  to: ['user@domain.com'], // Recipient(s)
                  subject: 'Hello!', // Email subject
                  body: 'How are you doing?', // Email body
                  cc: ['user2@domain.com', 'user3@domain.com'], // CC recipients
                  bcc: ['boss@domain.com'], // BCC recipients
                );

                // Try to compose a new email in a mail app
                OpenMailAppResult result =
                    await OpenMail.composeNewEmailInMailApp(
                        nativePickerTitle: 'Select email app to compose',
                        emailContent: email);

                // If no mail apps are installed
                if (!result.didOpen && !result.canOpen) {
                  showNoMailAppsDialog(context);
                }
                // If multiple mail apps are available on iOS, show a picker
                else if (!result.didOpen && result.canOpen) {
                  showDialog(
                    context: context,
                    builder: (_) => MailAppPickerDialog(
                      mailApps: result.options,
                      emailContent: email,
                    ),
                  );
                }
              },
            ),

            // Button to get the list of installed mail apps
            ElevatedButton(
              child: const Text("Get Mail Apps"),
              onPressed: () async {
                // Retrieve the list of installed mail apps
                var apps = await OpenMail.getMailApps();

                // If no mail apps are installed
                if (apps.isEmpty) {
                  showNoMailAppsDialog(context);
                }
                // Show a dialog listing all available mail apps
                else {
                  showDialog(
                    context: context,
                    builder: (context) {
                      return MailAppPickerDialog(
                        mailApps: apps,
                        emailContent: EmailContent(
                          to: ['user@domain.com'], // Pre-filled recipient
                          subject: 'Hello!', // Pre-filled subject
                          body: 'How are you doing?', // Pre-filled body
                          cc: [
                            'user2@domain.com',
                            'user3@domain.com'
                          ], // Pre-filled CC
                          bcc: ['boss@domain.com'], // Pre-filled BCC
                        ),
                      );
                    },
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  // Helper function to show a dialog when no mail apps are found
  void showNoMailAppsDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text("Open Mail App"),
          content: const Text("No mail apps installed"),
          actions: <Widget>[
            TextButton(
              child: const Text("OK"),
              onPressed: () {
                Navigator.pop(context); // Close the dialog
              },
            )
          ],
        );
      },
    );
  }
}

主要功能

  1. 检测已安装的电子邮件应用程序
    • 自动识别设备上已安装的电子邮件应用程序。
  2. 打开特定的电子邮件应用程序
    • 根据用户选择或应用程序配置打开特定的应用程序。
  3. 原生对话框支持
    • 在iOS上,当多个应用程序已安装时,显示对话框以让用户选择他们首选的应用程序。

支持

欢迎在GitHub仓库中提交问题,以添加对其他电子邮件应用程序的支持、报告错误或提出改进建议。

许可证

本包根据MIT许可证分发。详情请参阅LICENSE文件。


更多关于Flutter邮件发送插件open_mail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter邮件发送插件open_mail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用open_mail插件来发送邮件的详细步骤和代码示例。open_mail插件允许你通过设备的默认邮件客户端来发送电子邮件。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加open_mail插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  open_mail: ^3.2.2  # 请检查最新版本号

然后运行以下命令来安装依赖:

flutter pub get

步骤 2: 导入插件

在你的Dart文件中导入open_mail插件。

import 'package:open_mail/open_mail.dart';

步骤 3: 配置邮件信息

使用OpenMailOptions类来配置邮件信息。

void sendEmail() async {
  // 配置邮件信息
  final OpenMailOptions options = OpenMailOptions(
    to: ["recipient@example.com"],  // 收件人邮箱地址
    cc: ["cc@example.com"],          // 抄送邮箱地址(可选)
    bcc: ["bcc@example.com"],        // 密送邮箱地址(可选)
    subject: "Test Email",           // 邮件主题
    body: "This is a test email sent from Flutter using open_mail plugin.",  // 邮件正文
    isHTML: false,                   // 邮件正文是否为HTML格式
    attachments: [                   // 附件(可选)
      OpenMailAttachment(
        filePath: "/path/to/your/attachment.pdf",
        mimeType: "application/pdf",
        fileName: "attachment.pdf"
      )
    ],
    headers: {  // 邮件头(可选)
      "X-Custom-Header": "HeaderValue"
    }
  );

  try {
    // 打开邮件客户端并填充邮件信息
    await OpenMail.open(options);
    print("Email client opened successfully.");
  } catch (e) {
    // 处理错误
    print("Failed to open email client: ${e.message}");
  }
}

步骤 4: 调用发送邮件函数

你可以在一个按钮点击事件中调用sendEmail函数来发送邮件。

import 'package:flutter/material.dart';
import 'package:open_mail/open_mail.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Send Email Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: sendEmail,
            child: Text('Send Email'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 权限:确保你的应用在Android和iOS上都配置了必要的权限,以访问设备上的邮件客户端。
  2. 路径:附件路径应该是设备上的有效路径。如果你使用的是模拟器,确保路径是模拟器可以访问的。
  3. 设备支持:这个插件依赖于设备的邮件客户端,因此确保设备上有可用的邮件客户端。

通过以上步骤,你应该能够在Flutter应用中成功集成并使用open_mail插件来发送邮件。

回到顶部