搜索插件、代码仓与 APP 分类

插件详情v7.3.0

mailer

从 Dart 中编写并发送电子邮件。支持文件附件和 HTML 邮件。

AndroidiOSmacOSWindowsLinux
近 30 天下载
26.2万
喜欢数
450
Pub 分数
150

安装插件

flutter pub add mailer

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Mailer 是一个 Dart 包,可使 Dart 应用程序直接编写和发送电子邮件。它支持 HTML 邮件、纯文本消息和文件附件,适用于发送通知、报告或用户通信。该包设计简洁,可无缝集成到 SMTP 服务器,并在 Android、iOS、macOS、Windows 和 Linux 等多个平台上运行。该包非常适合 Flutter 应用中的服务器端或客户端邮件功能。

适合场景

  • 发送事务性邮件
  • 自动报告分发
  • 用户注册确认
  • 带附件的电子邮件
  • 多平台电子邮件支持

主要特点

  • 支持HTML和纯文本邮件
  • 文件附件处理
  • SMTP 集成
  • 跨平台兼容性
  • 简单的 API 设计

适合对象

  • 需要电子邮件功能的Flutter应用
  • 使用 Dart 的后端服务
  • 需要自动化电子邮件工作流的应用程序
  • 开发通知系统的开发者
  • 针对多个操作系统的项目

使用建议

  • 需要SMTP服务器配置
  • 可能需要额外的安全设置(例如 TLS/SSL)
  • 依赖网络连接
  • 不适用于高容量批量电子邮件发送
  • 身份验证凭据必须安全地进行管理

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

mailer

mailer is an easy-to-use library for composing and sending emails in Dart.

[!WARNING] This is an SMTP client library. It is designed to send emails by connecting to an existing SMTP server (like Gmail, SendGrid, Mailgun, or your own Postfix/Exim server).

It is not an SMTP server and cannot receive emails or accept incoming connections from other mail clients.

It supports:

  • Plaintext and HTML emails.
  • Attachments (files, streams, etc.).
  • Inline images (using CID).
  • Unicode support.
  • RFC 3030 (CHUNKING) for efficient large file transfer.
  • Secure connections (TLS/SSL) with context-aware sanitization.
  • Custom Address Validation strategies (strict, permissive, etc.).
  • Pre-configured services (Gmail, Yahoo, Hotmail, etc.) and generic SMTP support.

Usage

Simple Example (Gmail)
import 'package:mailer/mailer.dart';
import 'package:mailer/smtp_server.dart';

void main() async {
  String username = 'username@gmail.com';
  String password = 'password'; // Use an App Password if 2FA is enabled

  final smtpServer = gmail(username, password);
  // Use the SmtpServer class to configure any other SMTP server:
  // final smtpServer = SmtpServer('smtp.domain.com');

  final message = Message()
    ..from = Address(username, 'Your Name')
    ..recipients.add('destination@example.com')
    ..ccRecipients.addAll(['destCc1@example.com', 'destCc2@example.com'])
    ..bccRecipients.add(Address('bccAddress@example.com'))
    ..subject = 'Test Dart Mailer library :: 😀 :: ${DateTime.now()}'
    ..text = 'This is the plain text.\nThis is line 2 of the text part.'
    ..html = "<h1>Test</h1>\n<p>Hey! Here's some HTML content</p>";

  try {
    final sendReport = await send(message, smtpServer);
    print('Message sent: $sendReport');
  } on MailerException catch (e) {
    print('Message not sent.');
    for (var p in e.problems) {
      print('Problem: ${p.code}: ${p.msg}');
    }
  }
}
Advanced Usage
Attachments and Inline Images
final message = Message()
  ..from = Address(username, 'Your Name')
  ..recipients.add('destination@example.com')
  ..subject = 'Inline Image Test'
  ..html = '<h1>Test</h1><p>Here is an image:</p><img src="cid:myimg@3.141"/>'
  ..attachments = [
    FileAttachment(File('image.png'))
      ..location = Location.inline
      ..cid = '<myimg@3.141>'
  ];
Custom Address Validation

The library validates addresses before sending. By default, it uses a simple check (contains @ with non-empty parts). You can customize this behavior:

Available validators:

Validator Use Case
PracticalAddressValidator Recommended for input validation. Rejects IP literals, quoted strings, and domains without dots.
StrictAddressValidator Full RFC 5322 compliance. Accepts technically valid but uncommon formats.
PermissiveAddressValidator Accepts any non-empty string.

Validating user input (recommended):

import 'package:mailer/src/core/address_validator.dart';

final validator = PracticalAddressValidator();
final address = Address('test@example.com');

if (validator.validate(address)) {
  print('Address is valid');
} else {
  print('Address is invalid - may not be deliverable');
}

Using a validator for sending:

final message = Message()
  ..validator = StrictAddressValidator() // or PracticalAddressValidator()
  ..from = 'valid@example.com';
Persistent Connection

For sending multiple messages efficiently, use PersistentConnection.

var connection = PersistentConnection(smtpServer);

await connection.send(message1);
await connection.send(message2);

await connection.close();

Documentation

Tutorials

Flutter Developers

Flutter Web is NOT supported. Sending emails via SMTP directly from a browser is technically impossible due to security restrictions (CORS, lack of raw socket access). You must use a backend server or a proxy.

Security Warning: Do NOT embed your SMTP credentials (username/password) directly in your client-side Flutter code. If you do, anyone can extract them and use your account to send spam.

Johannes Milke has created an excellent tutorial on how to use mailer without needing to embed your credentials in the Flutter app:

The tutorial uses Firebase and requests the credentials of the Android user, avoiding storing your credentials in the app.

Server Developers

Suragch has written an excellent tutorial on How to send yourself email notifications from a Dart server.


If you have created a tutorial yourself (or know of one) please open an issue, so it can be added to this list. Note that tutorials don't need to be in English!

Logging

The library uses the logging package. By default, no logs are output. To see the SMTP communication (which is helpful for debugging), configure a logger listener:

import 'package:logging/logging.dart';

void main() {
  Logger.root.level = Level.ALL; // defaults to Level.INFO
  Logger.root.onRecord.listen((LogRecord rec) {
    print('${rec.level.name}: ${rec.time}: ${rec.message}');
  });

  // ... rest of your code
}

Security Note: Credentials (passwords, tokens) in AUTH commands are masked (*******) in the logs to prevent accidental leakage.

FAQ

Q: How do I handle large attachments? A: mailer supports RFC 3030 (CHUNKING). If the server supports it, mailer will automatically stream the data using BDAT commands, which is more efficient than the standard DATA command.

Q: How do I use Gmail with 2FA? A: You must generate an App Password in your Google Account settings and use that instead of your standard password.

License

MIT

所属分类

依赖

依赖清单 9 项

源码仓库

使用此插件的项目

所在榜单