إرسال البريد الإلكتروني بلغة Rust: مكتبتا lettre وasync-smtp
إرسال الرسائل الإلكترونية هو وظيفة أساسية لأي موقع تعليمي أو تجاري. في نظام Rust البيئي، توجد عدة حلول ناضجة لهذه المهمة. في هذه المقالة، سنشرح المكتبتين الأكثر شيوعًا: lettre (إرسال متزامن) وasync-smtp (إرسال غير متزامن). ستتعلم كيفية إعداد عميل SMTP، وإرسال رسالة بسيطة، وإضافة مرفقات، ومعالجة الأخطاء.
1. مكتبة lettre — الإرسال المتزامن
lettre هي مكتبة معيارية للعمل مع بروتوكولات البريد (SMTP، SMTPS، STARTTLS). وهي تدعم:
- الإرسال عبر خادم SMTP خارجي (Gmail، Yandex، Mail.ru، خادم مخصص).
- دعم تنسيقات MIME (نص، HTML، مرفقات).
- تشفير TLS/SSL.
- العمل مع الترميزات (Base64، quoted-printable).
1.1. تثبيت lettre
أضف إلى Cargo.toml:
[dependencies]lettre = "0.11"lettre_email = "0.11" # قديم ولكنه لا يزال مستخدمًا# للإصدار غير المتزامن — lettre مع ميزة "tokio1" أو "async-std1"1.2. مثال: إرسال رسالة بسيطة عبر SMTP
use lettre::transport::smtp::authentication::Credentials;use lettre::transport::smtp::SmtpTransport;use lettre::message::Message;use lettre::MessageBuilder;
fn main() { // إنشاء الرسالة let email = Message::builder() .from("sender@example.com".parse().unwrap()) .to("recipient@example.com".parse().unwrap()) .subject("مرحبًا من Rust!") .body("هذه رسالة اختبارية تم إرسالها باستخدام مكتبة lettre.".to_string()) .unwrap();
// إعدادات خادم SMTP (مثال لـ Gmail) let creds = Credentials::new("your_email@gmail.com".to_string(), "your_password".to_string());
// فتح اتصال آمن let mailer = SmtpTransport::starttls_relay("smtp.gmail.com") .unwrap() .credentials(creds) .build();
// الإرسال match mailer.send(&email) { Ok(_) => println!("تم إرسال الرسالة بنجاح!"), Err(e) => eprintln!("خطأ في الإرسال: {}", e), }}1.3. مثال: رسالة بمحتوى HTML ومرفق
use lettre::message::{MultiPart, SinglePart};use lettre::Message;
fn build_html_email() -> Message { // جزء HTML let html_part = SinglePart::builder() .header(lettre::message::header::ContentType::TEXT_HTML) .body(String::from("<h1>مرحبًا!</h1><p>هذه رسالة HTML.</p>"));
// مرفق (مثل ملف PDF) let attachment = SinglePart::builder() .header(lettre::message::header::ContentType::parse("application/pdf").unwrap()) .body(vec![0x25, 0x50, 0x44, 0x46]); // بيانات وهمية لـ PDF
// تجميع الرسالة متعددة الأجزاء Message::builder() .from("from@example.com".parse().unwrap()) .to("to@example.com".parse().unwrap()) .subject("رسالة مع HTML ومرفق") .multipart( MultiPart::mixed() .multipart(MultiPart::alternative().singlepart(html_part)) .singlepart(attachment), ) .unwrap()}2. الإرسال غير المتزامن: async-smtp
مكتبة async-smtp مخصصة للإرسال غير المحظور للرسائل في التطبيقات غير المتزامنة (مثل العمل مع tokio أو async-std). تستخدم نفس واجهة API مثل lettre، ولكن مع async/await.
2.1. تثبيت async-smtp
[dependencies]async-smtp = "0.6"tokio = { version = "1", features = ["full"] }2.2. مثال: الإرسال غير المتزامن
use async_smtp::{SmtpClient, SmtpTransport};use async_smtp::authentication::Credentials;use lettre::message::Mess