使用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 = "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执行以上代码,邮件发送成功

参考资料

[1]

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

本文由mdnice多平台发布

相关推荐
向前看-3 小时前
验证码机制
前端·后端
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
AskHarries6 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion7 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp8 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder8 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚9 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心10 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴10 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲10 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端