You are currently viewing MailHogでメール送信のテストを行う

MailHogでメール送信のテストを行う

Go言語で会員登録できるようなサイトを作成中です。
会員登録時は
・メールアドレスを登録
・仮登録のメールを送信する
・仮登録内のメールからメールアドレスの確認を行う(トークンを含むリンクをクリックする)
・本会員登録を行う
という流れになるかと思います

メール送信の開発を行う際、SMTPサーバーが必要になりますが、「MailHog」というDockerで構築できるSMTPサーバーを見つけたので紹介します

MailHogとは

GitHubのURLはこちら
https://github.com/mailhog/MailHog

MailHogはテストに利用できるSMTPサーバーです。テストなので、本当にメールを送信するわけではありません。
送信したメールは管理画面から確認することが出来ます。

docker-composeで起動してみる

docker-compose.yamlのサンプルはこちら
(https://lazesoftware.com/ja/blog/230221/ を参考にさせていただきました)

version: "3.8"
services:
  # MailHog コンテナ
  mailhog:
    image: mailhog/mailhog:latest
    ports:
      - 8025:8025
      - 1025:1025
    environment:
      MH_STORAGE: maildir
      MH_MAILDIR_PATH: /tmp
    volumes:
      - './data:/tmp'

ポート1025が送信用ポート
ポート8025が管理画面用のポートです

上記docker-compose.yamlを「docker compose up -d」で起動します。
起動に問題なければ、「localhost:8025」にアクセスすると管理画面にアクセス出来ます。

Go言語でメールを送信してみる

メールを送信するGoのサンプルは以下になります
(https://zenn.dev/spiegel/articles/20220929-sendmail-with-golang を参考にさせていただきました)

func sendPreRegisterMail(email string) {

	from := "gopher@example.net"
	recipients := []string{email}
	subject := "hello"
	body := "Hello World!\nHello Gopher!"

	auth := smtp.CRAMMD5Auth("user@example.com", "password")
	msg := []byte(strings.ReplaceAll(fmt.Sprintf("To: %s\nSubject: %s\n\n%s", strings.Join(recipients, ","), subject, body), "\n", "\r\n"))
	if err := smtp.SendMail(fmt.Sprintf("%s:%d", "localhost", "1025"), auth, from, recipients, msg); err != nil {
		fmt.Fprintln(os.Stderr, err)
	}
}

上記を実行すると、MailHogの管理画面に送信したメールが表示されます

こんな感じに、送信したメールが管理画面で確認できます。
本当に送信されるわけではないので、gmailアカウントにはメールは届いていません。
HTML形式のメールもテストできるのかは・・・まだ確認してません!

以上

ということで、気軽にメールの送信テストが行えるMailHogの紹介でした。メールのテストはしたいけど、SMTP立てるサーバーも時間もないというときに重宝思想です。

コメントを残す