Rust使用lettre实现邮件发送功能
作者: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邮件发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!