Flutter邮件管理插件enough_mail的使用
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);
}
}
}
}
相关项目
- enough_mail_html: 生成 HTML 输出。
- enough_mail_flutter: 提供常见的 Flutter 小部件。
- enough_mail_icalendar: 处理日历邀请。
- enough_mail_app: 一个完整的邮件应用。
- enough_convert: 提供缺少的编码。
贡献和反馈
如果你发现任何问题或有功能请求,请在 issue tracker 上提交。
感谢所有贡献者!你可以通过 fork 仓库并提交 Pull Request 来贡献代码。
许可证
enough_mail
基于商业友好的 Mozilla Public License 2.0 许可证发布。
希望这个指南能帮助你在 Flutter 应用中集成邮件功能。如果有任何问题或需要进一步的帮助,请随时提问!
更多关于Flutter邮件管理插件enough_mail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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'),
),
],
),
),
),
);
}
}
注意事项
- 安全性:不要将电子邮件密码硬编码在应用中。考虑使用环境变量或安全的密钥管理服务。
- 隐私:确保你遵守所有相关的隐私法律和规定,特别是当处理用户数据时。
- 错误处理:在实际应用中,应添加更全面的错误处理逻辑,以处理各种可能的失败情况。
- 依赖版本:确保你使用的是
enough_mail
的最新稳定版本,并查看其文档以获取最新的API信息和最佳实践。
这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。