Rust使用lettre实现邮件发送功能

 更新时间:2024年11月11日 09:39:28   作者:cci  
这篇文章主要为大家详细介绍了Rust如何使用lettre实现邮件发送功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

POP、IMAP、SMTP是什么

  • POP(Post Office Protocol):,用于客户端从邮件服务器上下载电子邮件。它允许用户将邮件服务器上的邮件检索到本地设备(如个人电脑、手机等)进行阅读、处理等操作
  • IMAP(Internet Mail Access Protocol):交互式邮件存取协议,用于客户端访问邮件服务器上的邮件,但与 POP 不同的是,用户可以通过 IMAP 协议在客户端上对邮件服务器上的邮件进行各种操作,如阅读、移动、删除、标记等,始终保持邮件存储在服务器上,用户可以从任何支持 IMAP 的设备访问和管理邮件
  • SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,负责将邮件从发件人的邮件客户端(如 Outlook、Thunderbird 等)或者邮件发送服务器(如本案例)传输到收件人的邮件服务器

这里使用SMTP发送邮件,所以要开启SMTP,由于outlook需要付费,这里使用qq邮箱

生成授权码,这个授权码就是邮件发送者的密码

1、添加crate

lettre = "0.11"

2、创建邮件对象和邮件发送者

同步发送,会阻塞代码

use lettre::{
    message::header::ContentType,
    transport::smtp::authentication::Credentials,
    Message,
    SmtpTransport,
    Transport,
};
async fn main() {
    //  创建邮件对象
    let email = Message::builder()
        // 设置邮件的发件人地址
        .from("xxxxxxx@qq.com".parse().unwrap())
        // 设置邮件的回复地址
        .reply_to("xxxxxx@qq.com".parse().unwrap())
        // 设置邮件的收件人地址
        .to("xxxxxx@gmail.com".parse().unwrap())
        // 设置邮件的主题
        .subject("锈化动力商城验证码")
        // 设置邮件的内容类型为纯文本
        .header(ContentType::TEXT_PLAIN)
        // 设置邮件的正文内容
        .body(String::from("验证码为:123456"))
        .unwrap();
    //  创建邮件发送者,第一个参数是邮件发送者账号,第二个参数是邮件发送者密码,这里使用授权码
    let creds = Credentials::new("xxxx@qq.com".to_owned(), "password".to_owned());

    // 使用ssl打开mail远程链接,填写发送邮件服务器地址,端口为465或587
    let mailer = SmtpTransport::starttls_relay("smtp.qq.com")
        .unwrap()
        .credentials(creds)
        .port(587)
        .build();
    // 发送邮件
    match mailer.send(&email) {
        Ok(_) => println!("Email sent successfully!"),
        Err(e) => println!("Could not send email: {e:?}"),
    }
}

异步发送,不会阻塞代码 Cargo.toml配置

tokio = { version = "1", features = ["full"] }
lettre = { version = "0.11.7", features = ["tokio1-native-tls", "builder"] }

代码

use lettre::{
    AsyncSmtpTransport, AsyncTransport, Message,
    message::header::ContentType, Tokio1Executor, transport::smtp::authentication::Credentials,
};

#[tokio::main]
async fn main() {
    //  创建邮件对象
    let email = Message::builder()
        // 设置邮件的发件人地址
        .from("xxxxx@qq.com".parse().unwrap())
        // 设置邮件的回复地址
        .reply_to("xxxx@qq.com".parse().unwrap())
        // 设置邮件的收件人地址
        .to("xxxx@gmail.com".parse().unwrap())
        // 设置邮件的主题
        .subject("锈化动力商城验证码")
        // 设置邮件的内容类型为纯文本
        .header(ContentType::TEXT_PLAIN)
        // 设置邮件的正文内容
        .body(String::from("验证码为:123456"))
        .unwrap();
    //  创建邮件发送者,第一个参数是邮件发送者账号,第二个参数是邮件发送者密码,这里使用授权码
    let creds = Credentials::new("xxxxx@qq.com".to_owned(), "password".to_owned());

    // 使用ssl打开mail远程链接,填写发送邮件服务器地址,端口为465或587
    let mailer: AsyncSmtpTransport<Tokio1Executor> = AsyncSmtpTransport::<Tokio1Executor>
    ::starttls_relay("smtp.qq.com")
        .unwrap()
        .credentials(creds)
        .port(587)
        .build();
    match mailer.send(email).await {
        Ok(_) => println!("Email sent successfully!"),
        Err(e) => println!("Could not send email: {e:?}"),
    }
}

效果

实际生产请将unwrap()替换为?传递错误或其他错误处理方式,使用邮件进行注册登陆时可以生成的验证码往redis里写一份,key设置为邮件名,设置过期时间为60s,注册登陆时与redis中的验证码比较即可

到此这篇关于Rust使用lettre实现邮件发送功能的文章就介绍到这了,更多相关Rust lettre邮件发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 2022最新Rust变量与数据类型讲解

    2022最新Rust变量与数据类型讲解

    rust 是强类型语言所有变量、常量都必须有明确的数据类型,这篇文章主要介绍了Rust变量与数据类型,需要的朋友可以参考下
    2022-11-11
  • 基于Rust构建一个Git提交历史可视化工具

    基于Rust构建一个Git提交历史可视化工具

    在软件开发中,版本控制系统的历史记录往往承载着项目的演进脉络,本文主要介绍了如何基于Rust构建一个Git提交历史可视化工具,感兴趣的小伙伴可以了解下
    2025-11-11
  • Rust中泛型的学习笔记

    Rust中泛型的学习笔记

    在Rust语言中,泛型是一种强大的工具,它允许我们编写可复用且灵活的代码,本文主要介绍了Rust中泛型的学习笔记,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 从迷你todo 命令行入门Rust示例详解

    从迷你todo 命令行入门Rust示例详解

    这篇文章主要为大家介绍了从一个迷你todo命令行入门Rust的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Rust 智能指针的使用详解

    Rust 智能指针的使用详解

    Rust智能指针是内存管理核心工具,本文就来详细的介绍一下Rust智能指针(Box、Rc、RefCell、Arc、Mutex、RwLock、Weak)的原理与使用场景,感兴趣的可以了解一下
    2025-09-09
  • 深入解析Rust中的智能指针

    深入解析Rust中的智能指针

    本文介绍了Rust中的智能指针,Box、Rc、Arc、RefCell、Mutex、RwLock对应的功能、场景与常用方法,并提供了组合使用方式,以及Cow、Pin的使用方式,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • 详解Rust中泛型的使用

    详解Rust中泛型的使用

    泛型是一种在编写代码时不指定具体类型,而在使用时再确定类型的编程技巧,本文将详细介绍 Rust 中泛型的相关概念和用法,希望对大家有所帮助
    2023-06-06
  • Rust时间库Chrono最佳使用实践

    Rust时间库Chrono最佳使用实践

    本文介绍了Rust中常用的日期时间处理库chrono,对比了标准库std::time和chrono的功能和适用场景,并详细讲解了chrono的核心数据类型、主要操作、进阶功能以及最佳实践,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Rust 高性能内存缓存 moka 完全指南

    Rust 高性能内存缓存 moka 完全指南

    本文介绍了Rust高性能内存缓存库moka,涵盖其核心特性、基础环境搭建、同步/异步实战、高级配置及生产环境最佳实践等内容,感兴趣的可以了解一下
    2026-05-05
  • 详解Rust调用tree-sitter支持自定义语言解析

    详解Rust调用tree-sitter支持自定义语言解析

    使用Rust语言结合tree-sitter库解析自定义语言需要定义语法、生成C解析器,并在Rust项目中集成,具体步骤包括创建grammar.js定义语法,使用tree-sitter-cli工具生成C解析器,以及在Rust项目中编写代码调用解析器,这一过程涉及到对tree-sitter的深入理解和Rust语言的应用技巧
    2024-09-09

最新评论