Rust使用lettre實現(xiàn)郵件發(fā)送功能
POP、IMAP、SMTP是什么
- POP(Post Office Protocol):,用于客戶端從郵件服務(wù)器上下載電子郵件。它允許用戶將郵件服務(wù)器上的郵件檢索到本地設(shè)備(如個人電腦、手機等)進行閱讀、處理等操作
- IMAP(Internet Mail Access Protocol):交互式郵件存取協(xié)議,用于客戶端訪問郵件服務(wù)器上的郵件,但與 POP 不同的是,用戶可以通過 IMAP 協(xié)議在客戶端上對郵件服務(wù)器上的郵件進行各種操作,如閱讀、移動、刪除、標記等,始終保持郵件存儲在服務(wù)器上,用戶可以從任何支持 IMAP 的設(shè)備訪問和管理郵件
- SMTP(Simple Mail Transfer Protocol):簡單郵件傳輸協(xié)議,負責(zé)將郵件從發(fā)件人的郵件客戶端(如 Outlook、Thunderbird 等)或者郵件發(fā)送服務(wù)器(如本案例)傳輸?shù)绞占说泥]件服務(wù)器
這里使用SMTP發(fā)送郵件,所以要開啟SMTP,由于outlook需要付費,這里使用qq郵箱

生成授權(quán)碼,這個授權(quán)碼就是郵件發(fā)送者的密碼

1、添加crate
lettre = "0.11"
2、創(chuàng)建郵件對象和郵件發(fā)送者
同步發(fā)送,會阻塞代碼
use lettre::{
message::header::ContentType,
transport::smtp::authentication::Credentials,
Message,
SmtpTransport,
Transport,
};
async fn main() {
// 創(chuàng)建郵件對象
let email = Message::builder()
// 設(shè)置郵件的發(fā)件人地址
.from("xxxxxxx@qq.com".parse().unwrap())
// 設(shè)置郵件的回復(fù)地址
.reply_to("xxxxxx@qq.com".parse().unwrap())
// 設(shè)置郵件的收件人地址
.to("xxxxxx@gmail.com".parse().unwrap())
// 設(shè)置郵件的主題
.subject("銹化動力商城驗證碼")
// 設(shè)置郵件的內(nèi)容類型為純文本
.header(ContentType::TEXT_PLAIN)
// 設(shè)置郵件的正文內(nèi)容
.body(String::from("驗證碼為:123456"))
.unwrap();
// 創(chuàng)建郵件發(fā)送者,第一個參數(shù)是郵件發(fā)送者賬號,第二個參數(shù)是郵件發(fā)送者密碼,這里使用授權(quán)碼
let creds = Credentials::new("xxxx@qq.com".to_owned(), "password".to_owned());
// 使用ssl打開mail遠程鏈接,填寫發(fā)送郵件服務(wù)器地址,端口為465或587
let mailer = SmtpTransport::starttls_relay("smtp.qq.com")
.unwrap()
.credentials(creds)
.port(587)
.build();
// 發(fā)送郵件
match mailer.send(&email) {
Ok(_) => println!("Email sent successfully!"),
Err(e) => println!("Could not send email: {e:?}"),
}
}
異步發(fā)送,不會阻塞代碼 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() {
// 創(chuàng)建郵件對象
let email = Message::builder()
// 設(shè)置郵件的發(fā)件人地址
.from("xxxxx@qq.com".parse().unwrap())
// 設(shè)置郵件的回復(fù)地址
.reply_to("xxxx@qq.com".parse().unwrap())
// 設(shè)置郵件的收件人地址
.to("xxxx@gmail.com".parse().unwrap())
// 設(shè)置郵件的主題
.subject("銹化動力商城驗證碼")
// 設(shè)置郵件的內(nèi)容類型為純文本
.header(ContentType::TEXT_PLAIN)
// 設(shè)置郵件的正文內(nèi)容
.body(String::from("驗證碼為:123456"))
.unwrap();
// 創(chuàng)建郵件發(fā)送者,第一個參數(shù)是郵件發(fā)送者賬號,第二個參數(shù)是郵件發(fā)送者密碼,這里使用授權(quán)碼
let creds = Credentials::new("xxxxx@qq.com".to_owned(), "password".to_owned());
// 使用ssl打開mail遠程鏈接,填寫發(fā)送郵件服務(wù)器地址,端口為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:?}"),
}
}
效果

實際生產(chǎn)請將unwrap()替換為?傳遞錯誤或其他錯誤處理方式,使用郵件進行注冊登陸時可以生成的驗證碼往redis里寫一份,key設(shè)置為郵件名,設(shè)置過期時間為60s,注冊登陸時與redis中的驗證碼比較即可
到此這篇關(guān)于Rust使用lettre實現(xiàn)郵件發(fā)送功能的文章就介紹到這了,更多相關(guān)Rust lettre郵件發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Rust調(diào)用tree-sitter支持自定義語言解析
使用Rust語言結(jié)合tree-sitter庫解析自定義語言需要定義語法、生成C解析器,并在Rust項目中集成,具體步驟包括創(chuàng)建grammar.js定義語法,使用tree-sitter-cli工具生成C解析器,以及在Rust項目中編寫代碼調(diào)用解析器,這一過程涉及到對tree-sitter的深入理解和Rust語言的應(yīng)用技巧2024-09-09

