Envio de email em Rust: bibliotecas lettre e async-smtp
O envio de e-mails é uma função básica de qualquer site educacional ou comercial. No ecossistema Rust, existem várias soluções maduras para esta tarefa. Neste artigo, abordaremos as duas bibliotecas mais populares: lettre (envio síncrono) e async-smtp (envio assíncrono). Você aprenderá como configurar um cliente SMTP, enviar um e-mail simples, adicionar anexos e tratar erros.
1. Biblioteca lettre — envio síncrono
lettre é uma biblioteca modular para trabalhar com protocolos de email (SMTP, SMTPS, STARTTLS). Ela suporta:
- Envio através de servidor SMTP externo (Gmail, Yandex, Mail.ru, próprio).
- Suporte a formatos MIME (texto, HTML, anexos).
- Criptografia TLS/SSL.
- Trabalho com codificações (Base64, quoted-printable).
1.1. Instalação do lettre
Adicione ao Cargo.toml:
[dependencies]lettre = "0.11"lettre_email = "0.11" # obsoleto, mas ainda usado# Para versão assíncrona — lettre com feature "tokio1" ou "async-std1"1.2. Exemplo: envio de e-mail simples via SMTP
use lettre::transport::smtp::authentication::Credentials;use lettre::transport::smtp::SmtpTransport;use lettre::message::Message;use lettre::MessageBuilder;
fn main() { // Criando o e-mail let email = Message::builder() .from("sender@example.com".parse().unwrap()) .to("recipient@example.com".parse().unwrap()) .subject("Olá do Rust!") .body("Este é um e-mail de teste enviado com a biblioteca lettre.".to_string()) .unwrap();
// Configurações do servidor SMTP (exemplo para Gmail) let creds = Credentials::new("your_email@gmail.com".to_string(), "your_password".to_string());
// Abrindo conexão segura let mailer = SmtpTransport::starttls_relay("smtp.gmail.com") .unwrap() .credentials(creds) .build();
// Enviando match mailer.send(&email) { Ok(_) => println!("E-mail enviado com sucesso!"), Err(e) => eprintln!("Erro ao enviar: {}", e), }}1.3. Exemplo: e-mail com conteúdo HTML e anexo
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>Olá!</h1><p>Este é um e-mail HTML.</p>"));
// Anexo (exemplo: arquivo PDF) let attachment = SinglePart::builder() .header(lettre::message::header::ContentType::parse("application/pdf").unwrap()) .body(vec![0x25, 0x50, 0x44, 0x46]); // placeholder para PDF
// Montando e-mail multicomponente Message::builder() .from("from@example.com".parse().unwrap()) .to("to@example.com".parse().unwrap()) .subject("E-mail com HTML e anexo") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), ) .unwrap()}2. Envio assíncrono: async-smtp
A biblioteca async-smtp é destinada ao envio não bloqueante de e-mails em aplicações assíncronas (por exemplo, em conjunto com tokio ou async-std). Ela usa a mesma API que lettre, mas com async/await.
2.1. Instalação do async-smtp
[dependencies]async-smtp = "0.6"tokio = { version = "1", features = ["full"] }2.2. Exemplo: envio assíncrono
use async_smtp::{SmtpClient, SmtpTransport};use async_smtp::authentication::Credentials;use lettre::message::Mess