Envoi d'email en Rust : bibliothèques lettre et mailparse
Rust est un langage de programmation système de plus en plus utilisé pour créer des services web et des microservices à forte charge. L'une des tâches typiques dans ces projets est l'envoi d'emails. Dans l'écosystème Rust, il existe plusieurs bibliothèques matures pour travailler avec les emails, parmi lesquelles se distinguent lettre et mailparse.
Dans cet article, nous allons détailler comment configurer l'envoi d'emails en Rust en utilisant SMTP, comment ajouter des pièces jointes et formater des emails HTML, ainsi que comment analyser les messages entrants. Ce contenu est destiné aux développeurs déjà familiers avec les bases de Rust.
Bibliothèque lettre : base pour l'envoi d'emails
Lettre est une bibliothèque moderne, asynchrone et synchrone pour travailler avec les emails en Rust. Elle prend en charge :
- Le transport SMTP (y compris STARTTLS et SSL/TLS) ;
- La création d'emails au format MIME (texte, HTML, pièces jointes) ;
- Le travail avec les encodages (Base64, Quoted-Printable) ;
- Les transports asynchrones via tokio ou async-std.
Pour ajouter lettre à votre projet, exécutez la commande :
cargo add lettrecargo add tokio --features full # pour le mode asynchroneEnvoi basique d'email via SMTP
Considérons un exemple simple : l'envoi d'un email texte via le serveur SMTP de Gmail (ou de tout autre fournisseur).
use lettre::transport::smtp::authentication::Credentials;use lettre::{Message, SmtpTransport, Transport};
fn main() -> Result<(), Box<dyn std::error::Error>> { // Création de l'email let email = Message::builder() .from("Expéditeur <from@example.com>".parse()?) .to("Destinataire <to@example.com>".parse()?) .subject("Bonjour depuis Rust !") .body("Ceci est un email de test envoyé depuis Rust.".to_string())?;
// Configuration SMTP (exemple pour Gmail) let creds = Credentials::new( "your_email@gmail.com".to_string(), "your_app_password".to_string(), );
// Création du transport let mailer = SmtpTransport::relay("smtp.gmail.com")? .credentials(creds) .build();
// Envoi match mailer.send(&email) { Ok(_) => println!("Email envoyé avec succès !"), Err(e) => eprintln!("Erreur d'envoi : {}", e), }
Ok(())}Attention : pour Gmail, vous aurez besoin d'un mot de passe d'application, et non de votre mot de passe principal. Pour d'autres fournisseurs (Yandex, Mail.ru, votre propre SMTP), modifiez l'adresse du serveur et le port.
Envoi d'emails HTML avec pièces jointes
Lettre permet de créer facilement des messages MIME multipartites. Ajoutons un corps HTML et une pièce jointe :
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>> { // Corps HTML de l'email let html_body = "<h1>Bonjour !</h1><p>Ceci est un email HTML depuis Rust.</p>".to_string();
// Création de l'email multipartite let email = Message::builder() .from("Expéditeur <from@example.com>".parse()?) .to("Destinataire <to@example.com>".parse()?) .subject("Email HTML avec pièce jointe") .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")?), ), )?;
// Envoi (similaire à l'exemple précédent)