使用Rust发送邮件


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 的作用包括:

  1. 邮件发送:它允许用户通过电子邮件客户端(如 Outlook、Thunderbird 等)发送邮件。
  2. 邮件中继:SMTP 服务器可以将邮件从一个服务器转发到另一个服务器,最终到达收件人的邮箱服务器。
  3. 邮件排队:如果目标服务器不可用,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 库来设置邮件内容的类型。

lettremime 库添加到项目的 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 = "[email protected]"// 收件邮箱

    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);
    }
}
使用Rust发送邮件_第1张图片 使用Rust发送邮件_第2张图片 使用Rust发送邮件_第3张图片

cargo run执行以上代码,邮件发送成功

使用Rust发送邮件_第4张图片

参考资料

[1]

lettre库: https://github.com/lettre/lettre

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)