Flutter邮件打开插件custom_open_mail_app的使用

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

Flutter邮件打开插件custom_open_mail_app的使用

打开邮件应用的Flutter插件

Flutter 2.10.0

pub package

这个库提供了一种查询设备上已安装的邮件应用并打开这些应用的能力。

如果你只是想编写一封电子邮件或通过mailto:链接打开任何应用,你可以考虑使用url_launcher

为什么使用这个插件?

虽然url_launcher可以帮助你编写电子邮件或打开默认邮件应用,但它无法控制哪个应用被打开,并且它不会告诉你设备上有哪些可用的应用。这在iOS上尤其是一个问题,因为即使用户更喜欢其他应用,也只会打开默认的Mail应用。

设置

在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>

请提交问题以添加你希望在iOS上看到的流行邮件应用。它们需要同时添加到你的应用的Info.plist文件和这个库的源代码中。

使用方法

使用选择器打开多个邮件应用

import 'package:open_mail_app/open_mail_app.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Open Mail App Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            ElevatedButton(
              child: Text("Open Mail App"),
              onPressed: () async {
                // Android: Will open mail app or show native picker.
                // iOS: Will open mail app if single mail app found.
                var result = await OpenMailApp.openMailApp(
                  nativePickerTitle: 'Select email app to open',
                );

                // 如果没有找到邮件应用,显示错误
                if (!result.didOpen && !result.canOpen) {
                  showNoMailAppsDialog(context);

                  // iOS: 如果发现多个邮件应用,显示对话框供选择。
                  // 在iOS中没有原生意图/默认应用系统,因此你必须自己实现。
                } else if (!result.didOpen && result.canOpen) {
                  showDialog(
                    context: context,
                    builder: (_) {
                      return MailAppPickerDialog(
                        mailApps: result.options,
                      );
                    },
                  );
                }
              },
            ),
            ElevatedButton(
              child: Text('Open mail app, with email already composed'),
              onPressed: () async {
                EmailContent email = EmailContent(
                  to: [
                    'user@domain.com',
                  ],
                  subject: 'Hello!',
                  body: 'How are you doing?',
                  cc: ['user2@domain.com', 'user3@domain.com'],
                  bcc: ['boss@domain.com'],
                );

                OpenMailAppResult result =
                    await OpenMailApp.composeNewEmailInMailApp(
                        nativePickerTitle: 'Select email app to compose',
                        emailContent: email);
                if (!result.didOpen && !result.canOpen) {
                  showNoMailAppsDialog(context);
                } else if (!result.didOpen && result.canOpen) {
                  showDialog(
                    context: context,
                    builder: (_) => MailAppPickerDialog(
                      mailApps: result.options,
                      emailContent: email,
                    ),
                  );
                }
              },
            ),
            ElevatedButton(
              child: Text("Get Mail Apps"),
              onPressed: () async {
                var apps = await OpenMailApp.getMailApps();

                if (apps.isEmpty) {
                  showNoMailAppsDialog(context);
                } else {
                  showDialog(
                    context: context,
                    builder: (context) {
                      return MailAppPickerDialog(
                        mailApps: apps,
                        emailContent: EmailContent(
                          to: [
                            'user@domain.com',
                          ],
                          subject: 'Hello!',
                          body: 'How are you doing?',
                          cc: ['user2@domain.com', 'user3@domain.com'],
                          bcc: ['boss@domain.com'],
                        ),
                      );
                    },
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  void showNoMailAppsDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text("Open Mail App"),
          content: Text("No mail apps installed"),
          actions: <Widget>[
            TextButton(
              child: Text("OK"),
              onPressed: () {
                Navigator.pop(context);
              },
            )
          ],
        );
      },
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用custom_open_mail_app插件来打开邮件应用的代码示例。这个插件允许你通过Flutter应用调用设备上的默认邮件客户端,并预填充邮件的收件人、主题和正文等信息。

首先,确保你已经在pubspec.yaml文件中添加了custom_open_mail_app依赖:

dependencies:
  flutter:
    sdk: flutter
  custom_open_mail_app: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下方式使用custom_open_mail_app插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Mail Opener Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Mail Opener Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _openMailApp,
            child: Text('Open Mail App'),
          ),
        ),
      ),
    );
  }

  void _openMailApp() async {
    try {
      final MailOptions mailOptions = MailOptions(
        recipients: ['example@example.com'],
        subject: 'Hello from Flutter!',
        body: 'This is a test email sent from Flutter app using custom_open_mail_app plugin.',
        isHTML: false,
        cc: ['cc@example.com'],  // 可选
        bcc: ['bcc@example.com'], // 可选
        attachmentPaths: [], // 可选,附件路径列表
      );

      await launchMail(mailOptions);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Email client opened successfully!')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Failed to open email client: $e')),
      );
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。点击按钮时,会尝试使用custom_open_mail_app插件打开设备上的默认邮件客户端,并预填充邮件信息。

注意几点:

  • MailOptions类用于配置邮件的各种属性,如收件人、主题、正文等。
  • launchMail函数用于实际打开邮件客户端。
  • 错误处理通过try-catch块来实现,以便在无法打开邮件客户端时显示适当的错误消息。

确保在真实项目中根据需求调整邮件选项,并处理可能发生的异常。这个示例提供了一个基础框架,你可以根据需要进行扩展和自定义。

回到顶部