إرسال البريد الإلكتروني بلغة Go (Golang): نظرة شاملة على المكتبات والأدوات
في تطوير الويب الحديث، يظل إرسال رسائل البريد الإلكتروني إحدى المهام الرئيسية للإشعارات والتسجيلات واستعادة كلمات المرور والنشرات البريدية. تقدم لغة Go (Golang) عدة طرق فعالة للتكامل مع خوادم SMTP. في هذه المقالة، سنشرح المكتبة القياسية net/smtp، والمكتبة الخارجية الشهيرة gomail، والمكتبة المتقدمة go-smtp. ستتعلم كيفية إرسال رسائل نصية بسيطة ورسائل HTML، وإضافة المرفقات، وتكوين الاتصال الآمن.
1. المكتبة القياسية net/smtp
حزمة net/smtp مدمجة في Go ولا تتطلب تثبيتًا إضافيًا. توفر وظائف أساسية للاتصال بخادم SMTP والمصادقة وإرسال الرسائل. ومع ذلك، للعمل مع المتطلبات الحديثة (HTML، المرفقات، SSL/TLS) ستحتاج إلى كتابة المزيد من الكود.
مثال بسيط لإرسال رسالة نصية
package main
import ( "fmt" "net/smtp")
func main() { // إعدادات خادم SMTP (مثال لـ Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// الموضوع ونص الرسالة (أبسط تنسيق) subject := "Subject: رسالة اختبار من Go" body := "مرحبًا! هذه الرسالة تم إرسالها باستخدام net/smtp." msg := []byte(subject + "" + body)
// المصادقة auth := smtp.PlainAuth("", from, password, smtpHost)
// الإرسال err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("خطأ في الإرسال:", err) return } fmt.Println("تم إرسال الرسالة بنجاح!")}هام: بالنسبة لـ Gmail، يجب استخدام كلمة مرور التطبيق (وليس كلمة المرور الرئيسية) والسماح بالوصول للتطبيقات غير الموثوقة. بالنسبة للخدمات الأخرى (Yandex، Mail.ru) قد تختلف المعلمات.
إرسال رسالة HTML عبر net/smtp
لإرسال رسالة HTML، يجب تحديد العنوان Content-Type بشكل صريح:
package main
import ( "fmt" "net/smtp")
func main() { smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// تكوين عناوين MIME headers := make(map[string]string) headers["From"] = from headers["To"] = "recipient@example.com" headers["Subject"] = "رسالة HTML من Go" headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=\\"UTF-8\\""
// تجميع الرسالة message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\\r", k, v) } message += "\\r" + "<h1>مرحبًا!</h1><p>هذه رسالة <b>HTML</b>.</p>"
auth := smtp.PlainAuth("", from, password, smtpHost) err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message)) if err != nil { fmt.Println("خطأ:", err) }}عيب net/smtp هو عدم دعم المرفقات والبنية المعقدة متعددة المكونات للرسالة. لمثل هذه المهام، من الأفضل استخدام مكتبات متخصصة.
2. مكتبة gomail
Gomail هي واحدة من أشهر المكتبات الخارجية لإرسال البريد الإلكتروني بلغة Go. توفر واجهة برمجة تطبيقات (API) سهلة الاستخدام، ودعم HTML، والمرفقات، وتضمين الصور، و SSL/TLS، والعناوين القابلة للتخصيص.
التثبيت
go get gopkg.in/mail.v2مثال لإرسال رسالة HTML مع مرفق
package main
import ( "crypto/tls" "fmt" gomail "gopkg.in/mail.v2")
func main() { m := gomail.NewMessage(