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.