Envío de correo electrónico en Rust: bibliotecas lettre y mailparse
Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para crear servicios web y microservicios de alta carga. Una de las tareas típicas en estos proyectos es el envío de correos electrónicos. En el ecosistema de Rust existen varias bibliotecas maduras para trabajar con correo electrónico, entre las que destacan lettre y mailparse.
En este artículo, analizaremos en detalle cómo configurar el envío de correos en Rust usando SMTP, cómo agregar archivos adjuntos y crear correos HTML, así como cómo analizar mensajes entrantes. El material está dirigido a desarrolladores que ya conocen los fundamentos de Rust.
Biblioteca lettre: base para el envío de correos
Lettre es una biblioteca moderna, asíncrona y síncrona para trabajar con correo electrónico en Rust. Soporta:
- Transporte SMTP (incluyendo STARTTLS y SSL/TLS);
- Creación de correos en formato MIME (texto, HTML, archivos adjuntos);
- Trabajo con codificaciones (Base64, Quoted-Printable);
- Transportes asíncronos a través de tokio o async-std.
Para agregar lettre a tu proyecto, ejecuta el comando:
cargo add lettrecargo add tokio --features full # para modo asíncronoEnvío básico de correo electrónico a través de SMTP
Veamos un ejemplo simple: enviar un correo de texto a través del servidor SMTP de Gmail (o de cualquier otro proveedor).
use lettre::transport::smtp::authentication::Credentials;use lettre::{Message, SmtpTransport, Transport};
fn main() -> Result<(), Box<dyn std::error::Error>> { // Creamos el correo let email = Message::builder() .from("Remitente <from@example.com>".parse()?) .to("Destinatario <to@example.com>".parse()?) .subject("¡Saludos desde Rust!") .body("Este es un correo de prueba enviado desde Rust.".to_string())?;
// Configuración SMTP (ejemplo para Gmail) let creds = Credentials::new( "your_email@gmail.com".to_string(), "your_app_password".to_string(), );
// Creamos el transporte let mailer = SmtpTransport::relay("smtp.gmail.com")? .credentials(creds) .build();
// Enviamos match mailer.send(&email) { Ok(_) => println!("¡Correo enviado exitosamente!"), Err(e) => eprintln!("Error al enviar: {}", e), }
Ok(())}Ten en cuenta: para Gmail necesitarás una contraseña de aplicación, no la contraseña principal. Para otros proveedores (Yandex, Mail.ru, SMTP propio), cambia la dirección del servidor y el puerto.
Envío de correos HTML con archivos adjuntos
Lettre permite crear fácilmente mensajes MIME de varias partes. Agreguemos un cuerpo HTML y un archivo adjunto:
use lettre::message::header::ContentType;use lettre::message::{Attachment, MultiPart, SinglePart};use lettre::{Message, SmtpTransport, Transport};
fn send_html_with_attachment() -> Result<(), Box<dyn std::error::Error>> { // Cuerpo HTML del correo let html_body = "<h1>¡Hola!</h1><p>Este es un correo HTML desde Rust.</p>".to_string();
// Creamos el correo de varias partes let email = Message::builder() .from("Remitente <from@example.com>".parse()?) .to("Destinatario <to@example.com>".parse()?) .subject("Correo HTML con archivo adjunto") .multipart( MultiPart::mixed() .singlepart( SinglePart::builder() .header(ContentType::TEXT_HTML) .body(html_body), ) .singlepart( Attachment::new("document.pdf".to_string()) .body(vec![0x25, 0x50, 0x44, 0x46], ContentType::parse("application/pdf")?), ), )?;
// Envío (similar al ejemplo anterior)