إرسال البريد الإلكتروني بلغة Rust: مكتبتا lettre وasync-smtp للقوائم البريدية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

إرسال البريد الإلكتروني بلغة 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                    

توصيات