Como enviar emails en Rust
Este post ilustra como usar la librería lettre para enviar emails con rust. Sigue los ejemplos de la documentación para enviar por smtp, usando credenciales de un correo de gmail:
Email simple
#Cargo.toml
[package]
name = "example-email"
version = "0.1.0"
edition = "2021"
[dependencies]
lettre = "0.10.0-rc.6"
anyhow = "1.0.57"//example-email-simple.rs
use lettre::{transport::smtp::authentication::Credentials, Message, SmtpTransport, Transport};
use anyhow::Result;
fn main() -> Result<()> {
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse()?)
.to("Hei <hei@domain.tld>".parse()?)
.subject("Simple email test from Rust")
.body(String::from("Be happy!"))?;
let creds = Credentials::new(
"smtp_username".to_string(),
"smtp_password".to_string()
);
// Open a remote connection to the SMTP relay server
let mailer = SmtpTransport::relay("smtp.gmail.com")?
.credentials(creds)
.build();
// Send the email
match mailer.send(&email) {
Ok(_) => Ok(println!("Email sent successfully!")),
Err(e) => panic!("Could not send email: {:?}", e),
}
}
Email con adjunto
Para componer un email con ficheros adjuntos usarermos los métodos Multipart, SinglePart y Attachment:
//example-mail.rs
use lettre::message::{header, Message};
use lettre::message::{header::ContentType, MultiPart, SinglePart, Attachment};
use lettre::transport::smtp::authentication::Credentials;
use lettre::{SmtpTransport, Transport};
use anyhow::Result;
use std::fs;
fn main() -> Result<()> {
let filename = "invoice.pdf";
let filebody = fs::read(&filename)?;
let content_type = ContentType::parse("application/pdf").unwrap();
let attachment = Attachment::new(filename.to_string())
.body(filebody, content_type);
let message = String::from("Hello there!!");
let email = Message::builder()
.from("mi_email@gmail.com".parse().unwrap())
.to("desintatrio@email.com".parse().unwrap())
.subject("Email with attachment test from Rust")
.multipart(
MultiPart::mixed()
.singlepart(
SinglePart::builder()
.header(header::ContentType::TEXT_PLAIN)
.body(message),
)
.singlepart(attachment),
)
.unwrap();
let creds = Credentials::new(
"smtp_username".to_string(),
"smtp_password".to_string()
);
// Open a remote connection to gmail
let mailer = SmtpTransport::relay("smtp.gmail.com")?
.credentials(creds)
.build();
// Send the email
match mailer.send(&email) {
Ok(_) => Ok(println!("Email sent successfully!")),
Err(e) => panic!("Could not send email: {:?}", e),
}
}