使用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);
    }
}

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

参考资料

1

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

本文由mdnice多平台发布

相关推荐
yu4106212 小时前
Rust 语言使用场景分析
开发语言·后端·rust
细心的莽夫2 小时前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
jack_xu4 小时前
高频面试题:如何保证数据库和es数据一致性
后端·mysql·elasticsearch
pwzs4 小时前
Java 中 String 转 Integer 的方法与底层原理详解
java·后端·基础
Asthenia04124 小时前
InnoDB文件存储结构与Socket技术(从Linux的FD到Java的API)
后端
Asthenia04124 小时前
RocketMQ 消息不丢失与持久化机制详解-生产者与Broker之间的详解
后端
〆、风神5 小时前
Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战
spring boot·分布式·后端
Asthenia04125 小时前
Select、Poll、Epoll 详细分析与面试深度剖析/C代码详解
后端
烛阴5 小时前
Node.js中必备的中间件大全:提升性能、安全与开发效率的秘密武器
javascript·后端·express