用于 Rust 的 lettre 库:发送电子邮件
\n\n1. 这是什么以及为什么需要它
\n\nlettre(法语中意为“信件”)是一个功能强大、异步且类型安全的 Rust 语言电子邮件发送库。它提供了一套完整的工具来创建和发送电子邮件消息,既支持简单的纯文本邮件,也支持带有附件的复杂 HTML 邮件。该库完全用 Rust 编写,没有系统级的外部依赖,这使其成为注重可移植性和安全性的项目的理想选择。
\n\n为什么需要 lettre?在现代 Web 开发中,发送电子邮件仍然是一项关键功能:用户注册、密码重置、通知、群发邮件。Rust 作为一种系统语言,传统上缺乏便捷的邮件处理工具。lettre 填补了这一空白,提供了优雅的 API、对 SMTP、MIME 和 SSL/TLS 标准的全面支持,以及与流行异步运行时(tokio、async-std)的集成。
\n\n该库的关键功能包括:支持 SMTP、SMTPS 和通过 STARTTLS 的 SMTP;创建带有附件的多部分 MIME 消息;处理 HTML 和纯文本部分;支持异步发送;自动编码附件和标头;以及在编译时提供完整的类型安全性,从而防止动态语言中常见的许多错误。
\n\n2. 安装
\n\n要安装 lettre 库,请将其添加到项目的 Cargo.toml 文件中:
[dependencies]\nlettre = "0.11"\n\n用于与 tokio 异步工作(推荐):
\n\n[dependencies]\nlettre = { version = "0.11", features = ["tokio1-rustls-tls", "builder"] }\ntokio = { version = "1", features = ["full"] }\n\n用于同步工作(无需异步运行时):
\n\n[dependencies]\nlettre = { version = "0.11", features = ["rustls-tls", "builder"] }\n\n添加依赖项后,执行以下命令:
\n\ncargo build\n\n3. 快速入门
\n\n通过 Gmail SMTP 服务器发送电子邮件的最小工作示例:
\n\nuse lettre::message::header::ContentType;\nuse lettre::transport::smtp::authentication::Credentials;\nuse lettre::{Message, SmtpTransport, Transport};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n // 创建邮件\n let email = Message::builder()\n .from("发件人 <your_email@gmail.com>".parse()?)\n .to("收件人 <recipient@example.com>".parse()?)\n .subject("来自 Rust 的问候!")\n .header(ContentType::TEXT_PLAIN)\n .body("这是一封使用 lettre 发送的测试邮件。".to_string())?;\n\n // 配置 SMTP 传输\n let creds = Credentials::new(\n "your_email@gmail.com".to_string(),\n "your_app_password".to_string() // 使用应用密码\n );\n\n let mailer = SmtpTransport::relay("smtp.gmail.com")?\n .credentials(creds)\n .build();\n\n // 发送\n match mailer.send(&email) {\n Ok(_) => println!("邮件发送成功!"),\n Err(e) => eprintln!("发送错误:{:?}", e),\n }\n\n Ok(())\n}\n\n4. 主要方法和结构
\n\n4.1. Message::builder()
\n签名: pub fn builder() -> MessageBuilder
描述: 创建一个新的构建器来构建电子邮件消息。构建器允许通过方法链设置邮件的所有参数:发件人、收件人、主题、内容和标头。
\n\nuse lettre::Message;\n\nlet email = Message::builder()\n .from("user@example.com".parse()?)\n .to("recipient@example.com".parse()?)\n .subject("测试")\n .body("程