Pengenalan Gomail

Gomail adalah paket sederhana dan efisien untuk mengirim email dalam Golang. Sudah diuji secara menyeluruh dan didokumentasikan.

Gomail hanya dapat mengirim email menggunakan server SMTP. Namun, API-nya fleksibel dan dapat dengan mudah mengimplementasikan metode seperti menggunakan local Postfix, API, dll., untuk mengirim email.

Ia menggunakan gopkg.in untuk kontrol versi, sehingga tidak akan ada perubahan yang tidak kompatibel dalam setiap versi.

Ia memerlukan penggunaan Go 1.2 atau versi yang lebih baru. Pada Go 1.5, dependensi eksternal tidak akan digunakan.

Fitur-fitur Gomail

Gomail mendukung fitur-fitur berikut:

  • Lampiran
  • Gambar inline
  • Template HTML dan teks
  • Encoding otomatis karakter khusus
  • SSL dan TLS
  • Mengirim email lebih dari satu menggunakan koneksi SMTP yang sama

Instalasi

go get gopkg.in/gomail.v2

Contoh

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")

// Mengirim email kepada Bob, Cora, dan Dan.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Contoh (Daemon)

Sebuah daemon yang mendengarkan channel dan mengirim semua pesan yang diterima.

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)
            }
        // Tutup koneksi ke server SMTP jika tidak ada email yang dikirim dalam 30 detik terakhir.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// Kirim email menggunakan channel ini dalam program Anda.

// Tutup channel untuk menghentikan daemon email.
close(ch)

Contoh (Langganan Email)

Mengirim langganan email yang disesuaikan secara efektif ke sekelompok penerima.

// Daftar penerima.
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()
}

Contoh (Tanpa otentikasi)

Mengirim email menggunakan server SMTP lokal.

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)
}

Contoh (Tanpa SMTP)

Kirim email menggunakan API atau 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 {
    // Implementasikan fungsi pengiriman email Anda dengan memanggil API atau menjalankan postfix, dll.
    fmt.Println("From:", from)
    fmt.Println("To:", to)
    return nil
})

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

FAQ

x509: sertifikat ditandatangani oleh otoritas yang tidak dikenal

Jika Anda menghadapi kesalahan ini, itu berarti klien yang menjalankan Gomail menganggap sertifikat yang digunakan oleh server SMTP tidak valid. Sebagai solusi sementara, Anda dapat melewati validasi rantai sertifikat server dan nama host dengan menggunakan 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}

    // Gunakan d untuk mengirim email.
}

Namun, harap dicatat bahwa ini tidak aman dan sebaiknya tidak digunakan dalam lingkungan produksi.