E-Mail-Versand in Rust: Die Bibliotheken lettre und async-smtp
Das Versenden von E-Mails ist eine grundlegende Funktion jeder Bildungs- oder kommerziellen Website. Im Rust-Ökosystem gibt es für diese Aufgabe mehrere ausgereifte Lösungen. In diesem Artikel betrachten wir die beiden beliebtesten Bibliotheken: lettre (synchroner Versand) und async-smtp (asynchroner Versand). Sie erfahren, wie Sie einen SMTP-Client einrichten, eine einfache E-Mail senden, Anhänge hinzufügen und Fehler behandeln.
1. Die Bibliothek lettre — Synchroner Versand
lettre ist eine modulare Bibliothek für die Arbeit mit Mail-Protokollen (SMTP, SMTPS, STARTTLS). Sie unterstützt:
- Versand über einen externen SMTP-Server (Gmail, Yandex, Mail.ru, eigener Server).
- Unterstützung von MIME-Formaten (Text, HTML, Anhänge).
- TLS/SSL-Verschlüsselung.
- Arbeit mit Kodierungen (Base64, quoted-printable).
1.1. Installation von lettre
Fügen Sie in Cargo.toml hinzu:
[dependencies]lettre = "0.11"lettre_email = "0.11" # veraltet, wird aber noch verwendet# Für die asynchrone Version — lettre mit Feature "tokio1" oder "async-std1"1.2. Beispiel: Senden einer einfachen E-Mail über SMTP
use lettre::transport::smtp::authentication::Credentials;use lettre::transport::smtp::SmtpTransport;use lettre::message::Message;use lettre::MessageBuilder;
fn main() { // E-Mail erstellen let email = Message::builder() .from("sender@example.com".parse().unwrap()) .to("recipient@example.com".parse().unwrap()) .subject("Hallo von Rust!") .body("Dies ist eine Test-E-Mail, gesendet mit der Bibliothek lettre.".to_string()) .unwrap();
// SMTP-Server-Einstellungen (Beispiel für Gmail) let creds = Credentials::new("your_email@gmail.com".to_string(), "your_password".to_string());
// Sichere Verbindung öffnen let mailer = SmtpTransport::starttls_relay("smtp.gmail.com") .unwrap() .credentials(creds) .build();
// Senden match mailer.send(&email) { Ok(_) => println!("E-Mail erfolgreich gesendet!"), Err(e) => eprintln!("Fehler beim Senden: {}", e), }}1.3. Beispiel: E-Mail mit HTML-Inhalt und Anhang
use lettre::message::{MultiPart, SinglePart};use lettre::Message;
fn build_html_email() -> Message { // HTML-Teil let html_part = SinglePart::builder() .header(lettre::message::header::ContentType::TEXT_HTML) .body(String::from("<h1>Hallo!</h1><p>Dies ist eine HTML-E-Mail.</p>"));
// Anhang (z.B. PDF-Datei) let attachment = SinglePart::builder() .header(lettre::message::header::ContentType::parse("application/pdf").unwrap()) .body(vec![0x25, 0x50, 0x44, 0x46]); // Platzhalter für PDF
// Mehrteilige E-Mail zusammenbauen Message::builder() .from("from@example.com".parse().unwrap()) .to("to@example.com".parse().unwrap()) .subject("E-Mail mit HTML und Anhang") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), ) .unwrap()}2. Asynchroner Versand: async-smtp
Die Bibliothek async-smtp ist für den nicht-blockierenden E-Mail-Versand in asynchronen Anwendungen konzipiert (z.B. in Kombination mit tokio oder async-std). Sie verwendet dieselbe API wie lettre, jedoch mit async/await.
2.1. Installation von async-smtp
[dependencies]async-smtp = "0.6"tokio = { version = "1", features = ["full"] }2.2. Beispiel: Asynchroner Versand
use async_smtp::{SmtpClient, SmtpTransport};use async_smtp::authentication::Credentials;use lettre::message::Mess Auch in der Bibliothek
Erstellung von CLI-Anwendungen in TypeScript: Überblick über Frameworks und Tools
Integration von Prometheus-Metriken in PHP: Bibliotheken und Beispiele
Aufgabenplaner in Node.js: node-cron, node-schedule und Bull
Internationalisierung (i18n) in Node.js: i18next und polyglot
Bildverarbeitung in Node.js: resize, crop mit Sharp und Jimp