Envio de email em Rust: bibliotecas lettre e mailparse
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para criar serviços web e microsserviços de alta carga. Uma das tarefas típicas em tais projetos é o envio de e-mails. No ecossistema Rust, existem várias bibliotecas maduras para trabalhar com e-mail, entre as quais se destacam lettre e mailparse.
Neste artigo, vamos detalhar como configurar o envio de e-mails em Rust usando SMTP, como adicionar anexos e formatar e-mails HTML, bem como analisar mensagens recebidas. O material é voltado para desenvolvedores que já conhecem os fundamentos do Rust.
Biblioteca lettre: base para envio de e-mails
Lettre é uma biblioteca moderna, assíncrona e síncrona para trabalhar com e-mail em Rust. Ela suporta:
- Transporte SMTP (incluindo STARTTLS e SSL/TLS);
- Formatação de e-mails no formato MIME (texto, HTML, anexos);
- Trabalho com codificações (Base64, Quoted-Printable);
- Transportes assíncronos via tokio ou async-std.
Para adicionar lettre ao seu projeto, execute o comando:
cargo add lettrecargo add tokio --features full # para modo assíncronoEnvio básico de e-mail via SMTP
Vamos considerar o exemplo mais simples — envio de um e-mail de texto através do servidor SMTP do Gmail (ou de qualquer outro provedor).
use lettre::transport::smtp::authentication::Credentials;use lettre::{Message, SmtpTransport, Transport};
fn main() -> Result<(), Box<dyn std::error::Error>> { // Formata o e-mail let email = Message::builder() .from("Remetente <from@example.com>".parse()?) .to("Destinatário <to@example.com>".parse()?) .subject("Olá do Rust!") .body("Este é um e-mail de teste enviado do Rust.".to_string())?;
// Configurações SMTP (exemplo para Gmail) let creds = Credentials::new( "your_email@gmail.com".to_string(), "your_app_password".to_string(), );
// Cria o transporte let mailer = SmtpTransport::relay("smtp.gmail.com")? .credentials(creds) .build();
// Envia match mailer.send(&email) { Ok(_) => println!("E-mail enviado com sucesso!"), Err(e) => eprintln!("Erro ao enviar: {}", e), }
Ok(())}Observe: para o Gmail, será necessária uma senha de aplicativo, não a senha principal. Para outros provedores (Yandex, Mail.ru, SMTP próprio), altere o endereço do servidor e a porta.
Envio de e-mails HTML com anexos
Lettre permite formatar facilmente mensagens MIME de várias partes. Vamos adicionar corpo HTML e anexo:
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>> { // Corpo HTML do e-mail let html_body = "<h1>Olá!</h1><p>Este é um e-mail HTML do Rust.</p>".to_string();
// Formata o e-mail de várias partes let email = Message::builder() .from("Remetente <from@example.com>".parse()?) .to("Destinatário <to@example.com>".parse()?) .subject("E-mail HTML com anexo") .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")?), ), )?;
// Envio (semelhante ao exemplo anterior)