use lettre::message::header::ContentType;
use lettre::message::Attachment;
use lettre::message::MultiPart;
use lettre::message::SinglePart;
use lettre::transport::smtp::authentication::Credentials;
use lettre::transport::smtp::Error;
use lettre::{Message, SmtpTransport, Transport};
pub struct MailerSender {
pub from: String,
pub password: String,
pub smtp_site: String,
}
impl MailerSender {
pub fn new(&self) -> SmtpTransport {
let creds = Credentials::new(self.from.clone(), self.password.clone());
SmtpTransport::relay(self.smtp_site.as_str())
.unwrap()
.credentials(creds)
.build()
}
pub async fn send_email(
&self,
to: String,
topic: String,
content: String,
filename: Option<String>,
filepath: Option<String>,
) -> Result<bool, Error> {
let filebody;
let content_type;
let mut attachment: Option<SinglePart> = None;
let message;
if let Some(_) = filename {
filebody = std::fs::read(filepath.unwrap()).unwrap();
content_type = ContentType::parse("application/pdf").unwrap();
attachment = Some(Attachment::new(filename.unwrap()).body(filebody, content_type));
}
match attachment {
Some(v) => {
message = Message::builder()
.from(self.from.parse().unwrap())
.to(to.parse().unwrap())
.subject(topic)
.header(ContentType::TEXT_PLAIN)
.multipart(
MultiPart::mixed()
.singlepart(v)
.singlepart(SinglePart::plain(content.to_string())), )
.unwrap();
match self.new().send(&message) {
Ok(_) => Ok(true),
Err(e) => Err(e),
}
}
None => {
message = Message::builder()
.from(self.from.parse().unwrap())
.to(to.parse().unwrap())
.subject(topic)
.header(ContentType::TEXT_PLAIN)
.multipart(
MultiPart::mixed().singlepart(SinglePart::plain(content.to_string())), )
.unwrap();
match self.new().send(&message) {
Ok(_) => Ok(true),
Err(e) => Err(e),
}
}
}
}
}
#[cfg(test)]
mod tests {
use super::MailerSender;
#[test]
fn test_send_plain_attachment_email() {
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let mailer = MailerSender {
from: "1984850802@qq.com".to_string(),
password: "sfckoixahcpodcbb".to_string(),
smtp_site: "smtp.qq.com".to_string(),
};
let _send_result = MailerSender::send_email(
&mailer,
"1984850802@qq.com".to_string(),
"hell".to_string(),
"hello,surprise".to_string(),
None,
None,
)
.await;
});
}
#[test]
fn test_send_html_email() {
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let mailer = MailerSender {
from: "1984850802@qq.com".to_string(),
password: "sfckoixahcpodcbb".to_string(),
smtp_site: "smtp.qq.com".to_string(),
};
let _send_result = MailerSender::send_email(
&mailer,
"1984850802@qq.com".to_string(),
"hell".to_string(),
"<h1 style='color:red'>hello,surprisess</h1>".to_string(),
None,
None,
)
.await;
});
}
#[test]
fn send_plain_files_email() {
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let mailer = MailerSender {
from: "1984850802@qq.com".to_string(),
password: "sfckoixahcpodcbb".to_string(),
smtp_site: "smtp.qq.com".to_string(),
};
let _send_result = MailerSender::send_email(
&mailer,
"3502728398@qq.com".to_string(),
"邮件".to_string(),
"<h1 style='color:red'>hello,surprise</h1>".to_string(),
Some("1.pdf".to_string()),
Some("resume.pdf".to_string()),
)
.await;
});
}
}