本期每周一库来介绍一个和发送邮件相关的库,库的名字使用了法语的信笺(lettre
)作为名字。
发送邮件是现在Web App常见的功能。常用于通过收发验证码来验证账号或者执行账号高权限操作的时候,例如抗击羊毛党的注册,修改密码的二次验证等;还可以作为订阅广告推送给用户定时发送订阅内容。
那么这时候发送邮件的功能就必不可少了,虽然现在有很多的serverless方案中集成了邮件验证,手机验证等。但是对于小型项目,集成的serverless身份验证全家桶开发方案会显得杀鸡用牛刀。另外一方面,天下没有免费的云,发送邮件的费用也是一笔不小的开支。拿大名鼎鼎的MailChimp举例,想要给用户发送推广邮件,需要购买昂贵的点数来付费。
说到这里,我们步入正题,用Rust实现邮件发送功能!
lettre的Github:lettre is a mailer library for Rust.
lettre的网站:lettre.at
Github上对库的特性进行了简单的说明:
- 多种传输方式
- 支持Unicode
- 使用了SMTP安全传输
- 易于使用
lettre的文档十分简单,介绍了lettre的功能,模块,结构,枚举等
接下来我们基于lettre实现一个简单的邮件发送程序
- 开发环境是Windows 10
- cargo脚手架
- 使用的邮件账户是Gmail账户。
使用Gmail邮箱账户发送邮件的时候需要注意两点
- 确保Gmail账户已经开启了多重验证
- 生成应用专用密码用于程序中登陆Gmail账号的密码
之所以要使用应用专用密码,是因为直接使用Gmail账号密码写入到程序中,Gmail会提示应用不安全,导致无法发送邮件。
接下来我们创建工程开始吧
使用cargo创建一个名为hello-lettre
的工程
cargo new hello-lettre
使用VsCode打开工程
code hello-lettre
在Cargo.toml
文件的[dependencies]
标签下添加lettre的引用,由于lettre的Github中的Readme更新不及时,需要参考lettre.at中的引用写法:
[dependencies]
lettre = "0.9"
lettre_email = "0.9"
mime = "0.3.13"
打开src/main.rs
文件,写入lettre库Github中的示例代码
extern crate lettre;
extern crate lettre_email;
extern crate mime;
use lettre_email::Email;
use lettre::smtp::authentication::Credentials;
use lettre::{SmtpClient, Transport};
fn main() {
let email_receiver = "YOUR_TARGET_EMAIL";
let mine_email = "YOUR_GMAIL_ADDRESS";
let smtp_server = "smtp.gmail.com";
let password = "YOUR_GMAIL_APPLICATION_PASSWORD"; //需要生成应用专用密码
let email = Email::builder()
.to(email_receiver)
.from(mine_email)
.subject("subject")
.html("<h1>Hi there</h1>")
.text("Message send by lettre Rust")
.build()
.unwrap();
let creds = Credentials::new(
mine_email.to_string(),
password.to_string(),
);
// Open connection to Gmail
let mut mailer = SmtpClient::new_simple(smtp_server)
.unwrap()
.credentials(creds)
.transport();
// Send the email
let result = mailer.send(email.into());
if result.is_ok() {
println!("Email sent");
} else {
println!("Could not send email: {:?}", result);
}
print!("{:?}", result);
mailer.close();
}
编译Debug版本的程序
cargo build
执行编译好的程序
target\debug\hello-lettre.exe
会在termial中看到执行结果如下:
最后给大家留一个思考内容,如果想在发送的邮件中添加附件,该如何修改程序来实现呢?
这就是本周的每周一库内容,使用lettre库发送邮件,是不是看起来更简单
评论区
写评论还没有评论