搜尋套件、儲存庫與 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 項

原始碼儲存庫

使用此套件的專案

所在榜單