Gomail'a Giriş

Gomail, Golang'da e-posta göndermek için basit ve verimli bir pakettir. Detaylı bir şekilde test edilmiş ve belgelenmiştir.

Gomail sadece SMTP sunucularını kullanarak e-posta gönderebilir. Ancak, API esnek olup e-posta göndermek için yerel Postfix, API'ler vb. yöntemleri kolayca uygulayabilir.

Sürüm kontrolü için gopkg.in kullanır, böylece her sürüm içinde uyumsuz değişiklikler olmaz.

Go 1.2 veya daha yeni bir sürümü kullanılması gerekmektedir. Go 1.5'te dış bağımlılıklar kullanılmayacaktır.

Gomail'in Özellikleri

Gomail aşağıdaki özellikleri destekler:

  • Ekler
  • Gömülü resimler
  • HTML ve metin şablonları
  • Özel karakterlerin otomatik kodlanması
  • SSL ve TLS
  • Aynı SMTP bağlantısını kullanarak birden fazla e-posta gönderme

Kurulum

go get gopkg.in/gomail.v2

Örnek

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

d := gomail.NewDialer("smtp.example.com", 587, "kullanıcı", "123456")

// Bob, Cora ve Dan’a e-posta gönder.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Örnek (Daemon)

Kanala dinleyen ve alınan tüm mesajları gönderen bir daemon.

ch := make(chan *gomail.Message)

go func() {
    d := gomail.NewDialer("smtp.example.com", 587, "kullanıcı", "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)
            }
        // Son e-posta gönderilmediyse SMTP sunucusuna olan bağlantıyı kapat.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// Programınızda bu kanalı kullanarak e-posta gönderin.

// E-posta daemonunu durdurmak için kanalı kapatın.
close(ch)

Örnek (E-posta Abonelik)

Özelleştirilmiş e-posta aboneliklerini bir grup alıcıya etkili bir şekilde gönderin.

// Alıcı listesi.
var list []struct {
    Name    string
    Address string
}

d := gomail.NewDialer("smtp.example.com", 587, "kullanıcı", "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", "Bülten #1")
    m.SetBody("text/html", fmt.Sprintf("Merhaba %s!", r.Name))

    if err := gomail.Send(s, m); err != nil {
        log.Printf("%q adresine e-posta gönderilemedi: %v", r.Address, err)
    }
    m.Reset()
}

Örnek (Kimlik doğrulama olmadan)

Yerel bir SMTP sunucusunu kullanarak e-posta gönderin.

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

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

Örnek (SMTP Olmadan)

API veya postfix kullanarak e-posta gönderme.

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

s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
    // API çağrısı yaparak veya postfix çalıştırarak e-posta gönderme işlemini uygulayın.
    fmt.Println("Gönderen:", from)
    fmt.Println("Alıcı:", to)
    return nil
})

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

SSS (Sıkça Sorulan Sorular)

x509: tanınmayan bir otorite tarafından imzalanan sertifika

Bu hatayla karşılaşırsanız, Gomail'i çalıştıran istemcinin SMTP sunucusu tarafından kullanılan sertifikayı geçersiz kabul ettiği anlamına gelir. Bu sorunu gidermek için sunucunun sertifika zinciri ve ana bilgisayar adının doğrulamasını atlayarak SetTLSConfig kullanabilirsiniz:

package main

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

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

    // E-posta göndermek için d değişkenini kullanın.
}

Ancak, lütfen unutmayın ki bu güvensizdir ve üretim ortamında kullanılmamalıdır.