< 返回版块

西沉 发表于 2019-12-20 10:25

Tags:rust

本期每周一库来介绍一个和发送邮件相关的库,库的名字使用了法语的信笺(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库发送邮件,是不是看起来更简单

评论区

写评论

还没有评论

1 共 0 条评论, 1 页