معرفی Gomail

Gomail یک بسته ساده و کارآمد برای ارسال ایمیل در Golang است. این بسته کاملاً تست شده و مستند شده است.

Gomail تنها می‌تواند ایمیل‌ها را با استفاده از سرورهای SMTP ارسال کند. با این حال، واسط برنامه نویسی آن انعطاف‌پذیر است و می‌تواند به راحتی روش‌هایی مانند استفاده از Postfix محلی، API و غیره را برای ارسال ایمیل پیاده‌سازی کند.

برای کنترل نسخه از gopkg.in استفاده می‌کند، بنابراین تغییرات ناسازگار در هر نسخه وجود ندارد.

استفاده از Go 1.2 یا نسخه‌های جدیدتر ضروری است. در Go 1.5، وابستگی‌های خارجی استفاده نخواهند شد.

ویژگی‌های Gomail

Gomail از ویژگی‌های زیر پشتیبانی می‌کند:

  • پیوست‌ها
  • تصاویر درون خطی
  • قالب‌های HTML و متنی
  • رمزنگاری خودکار کاراکترهای ویژه
  • SSL و TLS
  • ارسال چند ایمیل با استفاده از اتصال SMTP یکسان

نصب

go get gopkg.in/gomail.v2

نمونه کد

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]", "[email protected]")
m.SetAddressHeader("Cc", "[email protected]", "Dan")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/html", "Hello <b>Bob</b> and <i>Cora</i>!")
m.Attach("/home/Alex/lolcat.jpg")

d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")

// ارسال ایمیل به Bob، Cora و Dan.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

نمونه کد (Daemon)

یک daemon که به یک کانال گوش داده و تمام پیام‌های دریافتی را ارسال می‌کند.

ch := make(chan *gomail.Message)

go func() {
    d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")

    var s gomail.SendCloser
    var err error
    open := false
    for {
        select {
        case m, ok := <-ch:
            if !ok {
                return
            }
            if !open {
                if s, err = d.Dial(); err != nil {
                    panic(err)
                }
                open = true
            }
            if err := gomail.Send(s, m); err != nil {
                log.Print(err)
            }
        // در صورتی که تا آخرین ارسال ایمیل ۳۰ ثانیه نگذرفته باشد، اتصال به سرور SMTP را ببندید.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// از این کانال در برنامه خود برای ارسال ایمیل‌ها استفاده کنید.

// برای متوقف کردن daemon ایمیل، کانال را ببندید.
close(ch)

نمونه کد (اشتراک ایمیل)

ارسال موثر اشتراک‌نامه‌های ایمیل سفارشی به گروهی از گیرندگان.

// لیست گیرندگان.
var list []struct {
    Name    string
    Address string
}

d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
s, err := d.Dial()
if err != nil {
    panic(err)
}

m := gomail.NewMessage()
for _, r := range list {
    m.SetHeader("From", "[email protected]")
    m.SetAddressHeader("To", r.Address, r.Name)
    m.SetHeader("Subject", "Newsletter #1")
    m.SetBody("text/html", fmt.Sprintf("Hello %s!", r.Name))

    if err := gomail.Send(s, m); err != nil {
        log.Printf("Could not send email to %q: %v", r.Address, err)
    }
    m.Reset()
}

نمونه کد (بدون احراز هویت)

ارسال ایمیل با استفاده از یک سرور SMTP محلی.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")

d := gomail.Dialer{Host: "localhost", Port: 587}
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

مثال (بدون SMTP)

ارسال ایمیل با استفاده از API یا postfix.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hello!")
m.SetBody("text/plain", "Hello!")

s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
    // پیاده‌سازی تابع ارسال ایمیل خود را با فراخوانی یک API یا اجرای postfix و غیره انجام دهید.
    fmt.Println("از:", from)
    fmt.Println("به:", to)
    return nil
})

if err := gomail.Send(s, m); err != nil {
    panic(err)
}

سوالات متداول (FAQ)

x509: گواهی امضا شده توسط موسسه نامعتبر

اگر با این خطا مواجه شدید، این بار مشتری اجرای Gomail معتبر نمی‌داند که گواهی استفاده شده توسط سرور SMTP نامعتبر است. به عنوان یک راه حل، می‌توانید با استفاده از SetTLSConfig از اعتبارسنجی زنجیره گواهی و نام میزبان سرور گذشت کنید:

package main

import (
	"crypto/tls"
	
	"gopkg.in/gomail.v2"
)

func main() {
	d := gomail.NewDialer("smtp.example.com", 587, "user", "123456")
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

    // از d برای ارسال ایمیل‌ها استفاده کنید.
}

باید توجه داشته باشید که این روش ناامن است و باید در محیط تولید استفاده نشود.