使用 Rust 发送电子邮件:用于邮件群发的 lettre 和 async-smtp 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用 Rust 发送电子邮件:lettre 和 async-smtp 库

发送电子邮件是任何教育或商业网站的基本功能。在 Rust 生态系统中,有几个成熟的解决方案可以完成此任务。在本文中,我们将介绍两个最流行的库:lettre(同步发送)和 async-smtp(异步发送)。您将学习如何配置 SMTP 客户端、发送简单邮件、添加附件以及处理错误。



1. lettre 库 — 同步发送

lettre 是一个用于处理邮件协议(SMTP、SMTPS、STARTTLS)的模块化库。它支持:

  • 通过外部 SMTP 服务器发送(Gmail、Yandex、Mail.ru、自建服务器)。
  • 支持 MIME 格式(文本、HTML、附件)。
  • TLS/SSL 加密。
  • 处理编码(Base64、quoted-printable)。


1.1. 安装 lettre

在 Cargo.toml 中添加:

[dependencies]lettre = "0.11"lettre_email = "0.11"  # 已过时,但仍在使用# 对于异步版本 — 使用带有 feature "tokio1" 或 "async-std1" 的 lettre


1.2. 示例:通过 SMTP 发送简单邮件

use lettre::transport::smtp::authentication::Credentials;use lettre::transport::smtp::SmtpTransport;use lettre::message::Message;use lettre::MessageBuilder;

fn main() { // 创建邮件 let email = Message::builder() .from("sender@example.com".parse().unwrap()) .to("recipient@example.com".parse().unwrap()) .subject("来自 Rust 的问候!") .body("这是一封使用 lettre 库发送的测试邮件。".to_string()) .unwrap();

// SMTP 服务器配置(以 Gmail 为例) let creds = Credentials::new("your_email@gmail.com".to_string(), "your_password".to_string());

// 打开安全连接 let mailer = SmtpTransport::starttls_relay("smtp.gmail.com") .unwrap() .credentials(creds) .build();

// 发送 match mailer.send(&email) { Ok(_) => println!("邮件发送成功!"), Err(e) => eprintln!("发送错误:{}", e), }}


1.3. 示例:包含 HTML 内容和附件的邮件

use lettre::message::{MultiPart, SinglePart};use lettre::Message;

fn build_html_email() -> Message { // HTML 部分 let html_part = SinglePart::builder() .header(lettre::message::header::ContentType::TEXT_HTML) .body(String::from("<h1>你好!</h1><p>这是一封 HTML 邮件。</p>"));

// 附件(例如 PDF 文件) let attachment = SinglePart::builder() .header(lettre::message::header::ContentType::parse("application/pdf").unwrap()) .body(vec![0x25, 0x50, 0x44, 0x46]); // PDF 占位数据

// 组装多部分邮件 Message::builder() .from("from@example.com".parse().unwrap()) .to("to@example.com".parse().unwrap()) .subject("包含 HTML 和附件的邮件") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), ) .unwrap()}


2. 异步发送:async-smtp

async-smtp 库专为异步应用程序中的非阻塞邮件发送而设计(例如,与 tokio 或 async-std 配合使用)。它使用与 lettre 相同的 API,但采用 async/await 模式。



2.1. 安装 async-smtp

[dependencies]async-smtp = "0.6"tokio = { version = "1", features = ["full"] }


2.2. 示例:异步发送

use async_smtp::{SmtpClient, SmtpTransport};use async_smtp::authentication::Credentials;use lettre::message::Mess                    

推荐