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立てるサーバーも時間もないというときに重宝思想です。