Flutter邮件管理插件enough_mail的使用

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

Flutter邮件管理插件enough_mail的使用

enough_mail 是一个用于 Dart 和 Flutter 的 IMAP、POP3 和 SMTP 客户端库,适用于电子邮件开发。本文将介绍如何在 Flutter 应用中使用 enough_mail 插件。

安装

首先,在 pubspec.yaml 文件中添加 enough_mail 依赖:

dependencies:
  enough_mail: ^2.1.5

确保你已经安装了最新版本的 enough_mail,可以通过 Pub.dev 查看最新版本。

API 文档

完整的 API 文档可以在 这里 查阅。

高级 API 使用

高级 API 抽象了 IMAP 和 POP3 的细节,并自动重连,允许轻松监控邮箱中的新消息。

示例代码

以下是一个简单的示例,展示如何使用高级 API:

import 'dart:io';
import 'package:enough_mail/enough_mail.dart';

String userName = 'user.name';
String password = 'password';
String domain = 'domain.com';

void main() async {
  await mailExample();
}

MimeMessage buildMessage() {
  final builder = MessageBuilder.prepareMultipartAlternativeMessage(
    plainText: 'Hello world!',
    htmlText: '<p>Hello world!</p>',
  )
    ..from = [MailAddress('Personal Name', 'sender@domain.com')]
    ..to = [
      MailAddress('Recipient Personal Name', 'recipient@domain.com'),
      MailAddress('Other Recipient', 'other@domain.com')
    ];
  return builder.buildMimeMessage();
}

Future<void> mailExample() async {
  final email = '$userName@$domain';
  print('Discovering settings for $email...');
  final config = await Discover.discover(email);
  if (config == null) {
    print('Unable to auto-discover settings for $email');
    return;
  }
  print('Connecting to ${config.displayName}.');
  final account = MailAccount.fromDiscoveredSettings('my account', email, password, config);
  final mailClient = MailClient(account, isLogEnabled: true);
  try {
    await mailClient.connect();
    print('Connected');
    final mailboxes = await mailClient.listMailboxesAsTree(createIntermediate: false);
    print(mailboxes);
    await mailClient.selectInbox();
    final messages = await mailClient.fetchMessages(count: 20);
    messages.forEach(printMessage);
    mailClient.eventBus.on<MailLoadEvent>().listen((event) {
      print('New message at ${DateTime.now()}:');
      printMessage(event.message);
    });
    await mailClient.startPolling();
    final mimeMessage = buildMessage();
    await mailClient.sendMessage(mimeMessage);
  } on MailException catch (e) {
    print('High level API failed with $e');
  }
}

void printMessage(MimeMessage message) {
  print('From: ${message.from} with subject "${message.decodeSubject()}"');
  if (!message.isTextPlainMessage()) {
    print('Content-type: ${message.mediaType}');
  } else {
    final plainText = message.decodeTextPlainPart();
    if (plainText != null) {
      final lines = plainText.split('\r\n');
      for (final line in lines) {
        if (line.startsWith('>')) break;
        print(line);
      }
    }
  }
}

低级 API 使用

低级 API 提供了对 IMAP、SMTP 和 POP3 更底层的访问。

示例代码

以下是一个简单的低级 API 使用示例:

import 'dart:io';
import 'package:enough_mail/enough_mail.dart';

String userName = 'user.name';
String password = 'password';
String imapServerHost = 'imap.domain.com';
int imapServerPort = 993;
bool isImapServerSecure = true;
String smtpServerHost = 'smtp.domain.com';
int smtpServerPort = 465;
bool isSmtpServerSecure = true;

void main() async {
  await discoverExample();
  await imapExample();
  await smtpExample();
  exit(0);
}

Future<void> discoverExample() async {
  const email = 'someone@enough.de';
  final config = await Discover.discover(email, isLogEnabled: false);
  if (config == null) {
    print('Unable to discover settings for $email');
  } else {
    print('Settings for $email:');
    for (final provider in config.emailProviders!) {
      print('Provider: ${provider.displayName}');
      print('Provider-domains: ${provider.domains}');
      print('Documentation-url: ${provider.documentationUrl}');
      print('Incoming:');
      provider.incomingServers?.forEach(print);
      print(provider.preferredIncomingServer);
      print('Outgoing:');
      provider.outgoingServers?.forEach(print);
      print(provider.preferredOutgoingServer);
    }
  }
}

Future<void> imapExample() async {
  final client = ImapClient(isLogEnabled: false);
  try {
    await client.connectToServer(imapServerHost, imapServerPort, isSecure: isImapServerSecure);
    await client.login(userName, password);
    final mailboxes = await client.listMailboxes();
    print('Mailboxes: $mailboxes');
    await client.selectInbox();
    final fetchResult = await client.fetchRecentMessages(messageCount: 10, criteria: 'BODY.PEEK[]');
    fetchResult.messages.forEach(printMessage);
    await client.logout();
  } on ImapException catch (e) {
    print('IMAP failed with $e');
  }
}

Future<void> smtpExample() async {
  final client = SmtpClient('enough.de', isLogEnabled: true);
  try {
    await client.connectToServer(smtpServerHost, smtpServerPort, isSecure: isSmtpServerSecure);
    await client.ehlo();
    if (client.serverInfo.supportsAuth(AuthMechanism.plain)) {
      await client.authenticate('user.name', 'password', AuthMechanism.plain);
    } else if (client.serverInfo.supportsAuth(AuthMechanism.login)) {
      await client.authenticate('user.name', 'password', AuthMechanism.login);
    } else {
      return;
    }
    final mimeMessage = buildMessage();
    final sendResponse = await client.sendMessage(mimeMessage);
    print('Message sent: ${sendResponse.isOkStatus}');
  } on SmtpException catch (e) {
    print('SMTP failed with $e');
  }
}

void printMessage(MimeMessage message) {
  print('From: ${message.from} with subject "${message.decodeSubject()}"');
  if (!message.isTextPlainMessage()) {
    print('Content-type: ${message.mediaType}');
  } else {
    final plainText = message.decodeTextPlainPart();
    if (plainText != null) {
      final lines = plainText.split('\r\n');
      for (final line in lines) {
        if (line.startsWith('>')) break;
        print(line);
      }
    }
  }
}

相关项目

贡献和反馈

如果你发现任何问题或有功能请求,请在 issue tracker 上提交。

感谢所有贡献者!你可以通过 fork 仓库并提交 Pull Request 来贡献代码。

许可证

enough_mail 基于商业友好的 Mozilla Public License 2.0 许可证发布。

希望这个指南能帮助你在 Flutter 应用中集成邮件功能。如果有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,以下是如何在Flutter项目中使用enough_mail插件进行邮件管理的一个示例。enough_mail插件允许你在Flutter应用中发送和检查电子邮件。请注意,由于发送邮件涉及到用户的隐私和安全,实际项目中应谨慎处理相关操作,并确保符合法律法规和最佳实践。

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

dependencies:
  flutter:
    sdk: flutter
  enough_mail: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用enough_mail插件。

1. 配置权限(针对Android和iOS)

Android

android/app/src/main/AndroidManifest.xml中添加必要的权限,例如网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

iOS

ios/Runner/Info.plist中,你可能需要添加网络权限等配置,具体取决于你的需求。

2. 发送邮件示例

下面是一个简单的示例,展示如何使用enough_mail发送电子邮件:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _result = '';

  void _sendEmail() async {
    final Email email = Email(
      subject: 'Test Subject',
      body: 'This is a test email body.',
      recipients: ['recipient@example.com'],
      isHTML: false,
      attachmentPaths: [], // 如果需要附件,可以在这里添加文件路径
    );

    final SmtpServer smtpServer = SmtpServer(
      host: 'smtp.example.com',
      port: 587,
      username: 'your-email@example.com',
      password: 'your-email-password',
      security: SmtpSecurity.startTls,
    );

    try {
      await sendEmail(email, smtpServer);
      setState(() {
        _result = 'Email sent successfully!';
      });
    } catch (e) {
      setState(() {
        _result = 'Failed to send email: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Email Sender'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(_result),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _sendEmail,
                child: Text('Send Email'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 安全性:不要将电子邮件密码硬编码在应用中。考虑使用环境变量或安全的密钥管理服务。
  2. 隐私:确保你遵守所有相关的隐私法律和规定,特别是当处理用户数据时。
  3. 错误处理:在实际应用中,应添加更全面的错误处理逻辑,以处理各种可能的失败情况。
  4. 依赖版本:确保你使用的是enough_mail的最新稳定版本,并查看其文档以获取最新的API信息和最佳实践。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。

回到顶部