Envío de correo electrónico en Rust: potentes herramientas para trabajar con el correo
Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para crear servicios web robustos y de alto rendimiento. Una de las tareas típicas es el envío de correos electrónicos. En este artículo, analizaremos en detalle dos bibliotecas clave del ecosistema Rust para trabajar con correo electrónico: lettre (envío) y mailparse (análisis). Aprenderá a configurar un cliente SMTP, enviar un correo con archivos adjuntos y procesar el correo entrante.
Biblioteca lettre: envío de correos a través de SMTP
lettre es una biblioteca moderna, asíncrona y síncrona para enviar correos electrónicos a través de SMTP, SMTP-SSL y STARTTLS. Soporta:
- Envío de correos en texto plano y HTML
- Archivos adjuntos (imágenes, documentos, archivos comprimidos)
- Autenticación (LOGIN, PLAIN, XOAUTH2)
- Firma DKIM y cifrado TLS
- Trabajo con async/await (tokio, async-std)
Para empezar, agregue la dependencia en Cargo.toml:
[dependencies]lettre = { version = "0.11", features = ["builder", "smtp-transport", "tokio1-rustls-tls"] }tokio = { version = "1", features = ["full"] }Ejemplo básico: envío de un correo en texto plano
use lettre::transport::smtp::authentication::Credentials;use lettre::{Message, SmtpTransport, Transport};
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Formamos el correo let email = Message::builder() .from("Remitente <sender@example.com>".parse()?) .to("Destinatario <recipient@example.com>".parse()?) .subject("¡Saludos desde Rust!") .body("Este es un correo de prueba enviado con la biblioteca lettre.".to_string())?;
// Configuración SMTP (Gmail, Yandex, Mail.ru, etc.) let creds = Credentials::new("sender@example.com".to_string(), "your_password".to_string()); let mailer = SmtpTransport::relay("smtp.gmail.com")? .credentials(creds) .build();
// Envío match mailer.send(&email) { Ok(_) => println!("¡Correo enviado con éxito!"), Err(e) => eprintln!("Error al enviar: {}", e), } Ok(())}Envío de un correo HTML con archivos adjuntos
Para enviar un correo con marcado HTML y un archivo, use MultiPart:
use lettre::message::{header, MultiPart, SinglePart};use lettre::{Message, SmtpTransport, Transport};use std::fs;
let file_content = fs::read("document.pdf")?;let attachment = SinglePart::builder() .header(header::ContentType::parse("application/pdf")?) .header(header::ContentDisposition::attachment("document.pdf")) .body(file_content);
let html_part = SinglePart::builder() .header(header::ContentType::TEXT_HTML) .body(String::from("<h1>¡Hola!</h1><p>Este es un correo HTML con archivo adjunto.</p>"));
let email = Message::builder() .from("sender@example.com".parse()?) .to("recipient@example.com".parse()?) .subject("HTML + adjunto") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), )?;Biblioteca mailparse: análisis de correos entrantes
mailparse es una biblioteca ligera para analizar mensajes de correo electrónico en formato MIME. Es útil si procesa correo a través de IMAP/POP3 o lee archivos .eml. Las principales capacidades son:
- Extracción de encabezados (From, To, Subject, Date)
- Obtención del cuerpo del mensaje (texto/HTML)
- Extracción de archivos adjuntos con tipos MIME
- Decodificación Base64 y Quoted-Printable
Ejemplo: lectura de un archivo .eml
use mailparse::*;
fn main() { let eml_content = std::fs::read("email.eml")