Envío de email en Rust: bibliotecas lettre y async-smtp para boletines por correo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Envío de email en Rust: bibliotecas lettre y async-smtp

El envío de correos electrónicos es una función básica de cualquier sitio educativo o comercial. En el ecosistema de Rust existen varias soluciones maduras para esta tarea. En este artículo analizaremos las dos bibliotecas más populares: lettre (envío síncrono) y async-smtp (envío asíncrono). Aprenderá a configurar un cliente SMTP, enviar un correo simple, agregar adjuntos y manejar errores.



1. Biblioteca lettre — envío síncrono

lettre es una biblioteca modular para trabajar con protocolos de correo (SMTP, SMTPS, STARTTLS). Soporta:

  • Envío a través de un servidor SMTP externo (Gmail, Yandex, Mail.ru, propio).
  • Soporte de formatos MIME (texto, HTML, adjuntos).
  • Cifrado TLS/SSL.
  • Trabajo con codificaciones (Base64, quoted-printable).


1.1. Instalación de lettre

Agregue en Cargo.toml:

[dependencies]lettre = "0.11"lettre_email = "0.11"  # obsoleto, pero aún usado# Para la versión asíncrona — lettre con feature "tokio1" o "async-std1"


1.2. Ejemplo: envío de un correo simple a través de SMTP

use lettre::transport::smtp::authentication::Credentials;use lettre::transport::smtp::SmtpTransport;use lettre::message::Message;use lettre::MessageBuilder;

fn main() { // Creamos el correo let email = Message::builder() .from("sender@example.com".parse().unwrap()) .to("recipient@example.com".parse().unwrap()) .subject("¡Hola desde Rust!") .body("Este es un correo de prueba enviado con la biblioteca lettre.".to_string()) .unwrap();

// Configuración del servidor SMTP (ejemplo para Gmail) let creds = Credentials::new("your_email@gmail.com".to_string(), "your_password".to_string());

// Abrimos una conexión segura let mailer = SmtpTransport::starttls_relay("smtp.gmail.com") .unwrap() .credentials(creds) .build();

// Enviamos match mailer.send(&email) { Ok(_) => println!("¡Correo enviado exitosamente!"), Err(e) => eprintln!("Error al enviar: {}", e), }}


1.3. Ejemplo: correo con contenido HTML y adjunto

use lettre::message::{MultiPart, SinglePart};use lettre::Message;

fn build_html_email() -> Message { // Parte HTML let html_part = SinglePart::builder() .header(lettre::message::header::ContentType::TEXT_HTML) .body(String::from("<h1>¡Hola!</h1><p>Este es un correo HTML.</p>"));

// Adjunto (por ejemplo, archivo PDF) let attachment = SinglePart::builder() .header(lettre::message::header::ContentType::parse("application/pdf").unwrap()) .body(vec![0x25, 0x50, 0x44, 0x46]); // marcador de posición para PDF

// Armamos el correo multicomponente Message::builder() .from("from@example.com".parse().unwrap()) .to("to@example.com".parse().unwrap()) .subject("Correo con HTML y adjunto") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), ) .unwrap()}


2. Envío asíncrono: async-smtp

La biblioteca async-smtp está diseñada para el envío no bloqueante de correos en aplicaciones asíncronas (por ejemplo, en combinación con tokio o async-std). Utiliza la misma API que lettre, pero con async/await.



2.1. Instalación de async-smtp

[dependencies]async-smtp = "0.6"tokio = { version = "1", features = ["full"] }


2.2. Ejemplo: envío asíncrono

use async_smtp::{SmtpClient, SmtpTransport};use async_smtp::authentication::Credentials;use lettre::message::Mess                    

Recommendations