SMTP协议与MIME协议
SMTP(简单邮件传输协议,Simple Mail Transfer Protocol)是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件,而邮件的接收通常由 POP(邮局协议)或 IMAP(互联网消息访问协议)来处理。
POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S
因特网信息访问协议(缩写为IMAP,以前称作交互邮件访问协议)是一个应用层协议,用来从本地邮件客户端(如Microsoft Outlook、Outlook Express、Foxmail、Mozilla Thunderbird)访问远程服务器上的邮件。
SMTP 的作用包括:
-
邮件发送:它允许用户通过电子邮件客户端(如 Outlook、Thunderbird 等)发送邮件。 -
邮件中继:SMTP 服务器可以将邮件从一个服务器转发到另一个服务器,最终到达收件人的邮箱服务器。 -
邮件排队:如果目标服务器不可用,SMTP 服务器可以将邮件保存在队列中,稍后再次尝试发送。
SMTP 基于 TCP(传输控制协议),而不是 UDP(用户数据报协议)。TCP 提供了一种可靠的方式来确保数据包的顺序和完整性,这对于电子邮件传输非常重要。
尽管 SMTP 非常有效于处理文本信息的发送,但它本身并不支持非文本附件(如图片、视频、文档等)。
MIME扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;
非文本格式附件(二进制、声音、图像等);
由多部分(multiple parts)组成的消息体;
包含非ASCII字符的头信息(Header information)
MIME(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)协议, 是一种扩展 SMTP 的标准,使电子邮件能够支持诸如文本、图像、音频和视频等不同格式的内容,以及多部分消息体和字符编码。通过 MIME,电子邮件能够包含丰富的多媒体内容,这在现代通信中是非常必需的。
使用Rust发送邮件
在 Rust 中发送电子邮件可以通过使用第三方库来实现,例如 lettre库[1]。lettre
提供了发送邮件的功能,包括与 SMTP 服务器的交互。此外,可能还需要使用 mime
库来设置邮件内容的类型。
将 lettre
和 mime
库添加到项目的 Cargo.toml
文件中:
[dependencies]
lettre = "0.11.2"
mime = "0.3"
可用以下代码来发送一封简单的电子邮件:
use lettre::{transport::smtp::authentication::Credentials, Message, SmtpTransport, Transport};
use std::error::Error;
fn send_email() -> Result<(), Box<dyn Error>> {
let from = "xxxx"; // 发件邮箱
let to = "yyyy@163.com"; // 收件邮箱
let email = Message::builder()
.from(from.parse()?)
.to(to.parse()?)
.subject("Rust Email Test")
.body("Hello from Rust with lettre!".to_string())?;
let smtp_server = "smtp.qq.com"; // 根据邮件服务商而定
let smtp_username = "xxxx"; // 发件邮箱
let smtp_password = "xxxxxxx"; // 授权码,不同邮件服务商获取方式有所不同,可搜索解决;qq邮箱可参考 https://codeantenna.com/a/PwKbc0S5dd
let creds = Credentials::new(smtp_username.to_string(), smtp_password.to_string());
let mailer = SmtpTransport::relay(smtp_server)?
.credentials(creds)
.build();
match mailer.send(&email) {
Ok(_) => println!("Email sent successfully"),
Err(e) => eprintln!("Could not send the email: {:?}", e),
}
Ok(())
}
fn main() {
if let Err(e) = send_email() {
eprintln!("An error occurred: {}", e);
}
}
cargo run执行以上代码,邮件发送成功
参考资料
lettre库: https://github.com/lettre/lettre
本文由 mdnice 多平台发布