Mengirim Email Menggunakan Golang

By Rizky Kurniawan - December 21, 2023 ~5 mins read

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.

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

Bagikan:

Ingin Berdiskusi?

Yuk bergabung di Grup Telegram Ruang Developer atau mulai diskusi melalui GitHub. See You!

Dapatkan contoh source code project backend, frontend, atau fullstack untuk kamu amati, tiru, dan modifikasi sesuka hati. Klik untuk melihat detail!
comments powered by Disqus

Berlangganan Gratis

Kamu akan menerima email update dari Ruang Developer

Beri Dukungan

Beri dukungan, dapatkan full source code project web untuk bahan referensi, tiru, dan modifikasi.
Lightbox