RUANGDEVELOPER.com - Halo Talenta Digital! Gimana kabarnya hari ini? Tentu masih sehat dan semangat kan? Setelah sekian lama tidak bertemu, maka pada kesempatan kali ini kita bertemu lagi dengan topik yang lumayan seru yaitu cara mengirim email SMTP menggunakan Golang.
Pengiriman email dalam sebuah aplikasi merupakan salah satu fitur yang bisa dikatakan sangat penting. Salah satu contoh yang sering kita jumpai adalah pada saat ingin melakukan reset kata sandi atau verifikasi alamat email. Beberapa waktu yang lalu (dah lama sih :D) kita sudah pernah belajar mengirimkan email menggunakan PHP. Kalau kamu lupa atau belum sempat membacanya, kamu bisa cek tulisannya di sini ya (tapi nanti setelah selesai dari sini, hehehe).
Mari kita mulai!
Menyiapkan Project
Buat folder dan masuk ke folder
mkdir golang-mail && cd golang-mail
Init Go modul
go mod init golang-mail
Install dependency
go get gopkg.in/gomail.v2
go get github.com/stretchr/testify
Gas Ngoding!
Langkah pertama adalah membuat file mail.go
di root folder project.
Membuat Constant
Constant berisi kredensial SMTP dan email pengirim dan tujuan reply. Pada tulisan ini, saya menggunakan Mailtrap untuk menguji coba pengiriman email. Kamu juga bisa menggunakan SMTP server lain seperti MailHog atau Mailpit, atau bahkan menggunakan real SMTP server yang biasanya disediakan oleh penyedia layanan Hosting.
Jangan menggunakan kredensial yang sama dengan contoh saya ya, sudah pasti gagal connect ðŸ˜
const (
smtpHost = "sandbox.smtp.mailtrap.io"
smtpPort = 587
smtpUser = "43374cf35e6v12"
smtpPass = "5c8a4af720w094"
mailFrom = "[email protected]"
mailReplyTo = "[email protected]"
)
Membuat Fungsi Untuk Inisialisasi Dialer
Sebuah dialer adalah objek yang memfasilitasi pembuatan koneksi ke server email untuk mengirimkan email. Setelah dialer dikonfigurasi, maka dialer dapat digunakan untuk membentuk koneksi ke server email dan mengirim email.
func InitDialer() *gomail.Dialer {
dialer := gomail.NewDialer(
smtpHost,
smtpPort,
smtpUser,
smtpPass,
)
dialer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
return dialer
}
Fungsi InitDialer ini bertujuan untuk menginisialisasi dan mengonfigurasi objek dialer dari gomail. Sebuah objek dialer baru dibuat dengan menggunakan fungsi gomail.NewDialer(). Parameter-parameter yang diperlukan adalah smtpHost (host server email), smtpPort (port server email), smtpUser (username email), dan smtpPass (password email).
Konfigurasi TLS pada objek dialer diatur dengan membuat dan menetapkan konfigurasi TLS baru. InsecureSkipVerify diatur sebagai true, yang berarti mail client tidak akan memverifikasi sertifikat server. Pengaturan ini biasanya digunakan saat pengembangan atau uji coba saja dan tidak dianjurkan untuk digunakan pada server produksi karena dapat mengakibatkan risiko keamanan.
Membuat Fungsi Untuk Mengirim Email
Setelah kita bisa membuat dialer menggunakan fungsi InitDialer
, selanjutnya kita bisa menggunakan dialer untuk mengirim email ke alamat tujuan. Untuk memisahkan kode, kita buat fungsi tersendiri untuk mengirimkan email seperti berikut ini.
func SendMail(
to string,
subject string,
message string,
) error {
dialer := InitDialer()
mail := gomail.NewMessage()
mail.SetHeader("From", mailFrom)
mail.SetHeader("To", to)
mail.SetHeader("Reply-To", mailReplyTo)
mail.SetHeader("Subject", subject)
mail.SetBody("text/html", message)
return dialer.DialAndSend(mail)
}
Fungsi SendMail ini bertujuan untuk mengirimkan email mDialerenggunakan objek dialer yang telah dikonfigurasi sebelumnya. Fungsi ini menerima tiga parameter: to (alamat email penerima), subject (subjek email), dan message (isi pesan email). Sebuah objek Message baru dari paket gomail dibuat untuk menampung informasi tentang email yang akan dikirim. Header email diatur menggunakan metode SetHeader untuk mengisi informasi seperti pengirim (From), penerima (To), alamat balasan (Reply-To), dan subjek (Subject). Selanjutnya, metode SetBody digunakan untuk menentukan jenis konten dan isi pesan email.
Fungsi DialAndSend pada objek dialer digunakan untuk mengirimkan email yang telah disiapkan. Fungsi ini mengembalikan nilai error, dan jika email berhasil dikirim, nilai error akan nil. Jika terjadi kesalahan selama pengiriman, error akan berisi informasi tentang kesalahan tersebut.
Berikut adalah keseluruhan kode pada file mail.go
package main
import (
"crypto/tls"
"gopkg.in/gomail.v2"
)
const (
smtpHost = "sandbox.smtp.mailtrap.io"
smtpPort = 587
smtpUser = "43374cf35e6v12"
smtpPass = "5c8a4af720w094"
mailFrom = "[email protected]"
mailReplyTo = "[email protected]"
)
func InitDialer() *gomail.Dialer {
dialer := gomail.NewDialer(
smtpHost,
smtpPort,
smtpUser,
smtpPass,
)
dialer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
return dialer
}
func SendMail(
to string,
subject string,
message string,
) error {
dialer := InitDialer()
mail := gomail.NewMessage()
mail.SetHeader("From", mailFrom)
mail.SetHeader("To", to)
mail.SetHeader("Reply-To", mailReplyTo)
mail.SetHeader("Subject", subject)
mail.SetBody("text/html", message)
return dialer.DialAndSend(mail)
}
Pengujian
Semua kode sudah kita siapkan dan kini saatnya kita lakukan pengujian kode untuk memastikan semuanya sudah OK dan bekerja dengan baik.
Buat file baru bernama mail_test.go
di dalam root folder project.
package main
// Kode testing di sini
Buat unit testing untuk fungsi InitDialer.
func TestInitDialer(t *testing.T) {
dialer := InitDialer()
assert.NotEmpty(t, dialer)
}
assert diimport dari package testify (import github.com/stretchr/testify/assert)
Buat unit testing untuk fungsi SendMail.
func TestSendMail(t *testing.T) {
err := SendMail(
"[email protected]",
"Halo, ini subject",
"Halo, ini isi pesan yang dikirim menggunakan GoMail ya!",
)
assert.NoError(t, err)
}
Jalankan pengujian dengan perintah berikut:
go test
Pastikan semua test lolos
PASS
ok golang-mail 4.033s
Cek juga di kotak masuk email, pastikan email terkirim.
Selesai
Selamat! Sekarang kita sudah berhasil mengirimkan email menggunakan Golang. Perlu kamu ketahui bahwa ini adalah bagian yang sederhana dari sebuah proses pengiriman email di aplikasi. Pada penggunaan yang sebenarnya, tentu kita tidak akan mengirim email berisi text sederhana seperti contoh pada tutorial ini, email yang dikirim biasanya menggunakan html dan berisi berbagai data dinamis yang akan ditampilkan pada email. Selain itu, proses pengiriman email juga bisa memakan waktu yang lama karena melibatkan server lain (SMTP Server). Oleh karena itu, kita juga perlu belajar menerapkan mekanisme antrean pada proses pengiriman email di aplikasi kita.
Kita akan bahas hal-hal menarik tersebut di lain waktu ya. Silahkan tinggalkan komentar kamu jika ada sesuatu yang ingin kamu tanyakan. Sampai jumpa! 👋👋👋
Source code tutorial ini dapat kamu lihat di link berikut: https://github.com/ruangdeveloper/golang-send-mail