こんにちは、カミナシの@tomiです。
開発環境で送信したメールを確認するためにMailHogを導入してみました。 MailHogとは送信したメールをブラウザで確認できるツールです。
導入のきっかけ
以前、Ruby on Railsで開発している際に、letter_openerという送信したメールをブラウザで確認できるgemを使っていて、メール周りの開発が捗りました。
Golangでもメールが送信されたかを確認する方法を探してたらMailHogというツールを見つけたので、とりあえず導入してみました。(勝手にプルリクを出した)
導入方法
導入はとても簡単で、
この2点だけです。
Dockerコンテナの作成
Docker Hubに公開されているイメージを使います
https://hub.docker.com/r/mailhog/mailhog/
docker-compose.yml
を作成
version: "3" services: mailhog: image: mailhog/mailhog ports: - "1025:1025" - "8025:8025" logging: driver: json-file options: max-file: '1' max-size: 1m
1025はSMTPサーバー、8025はブラウザでメール確認用のHTTPサーバーのポートとなっています。
今回はホスト側からMailHogのSMTPサーバーに送信するので、portsに設定して外部に公開しています。
docker-compose up -d
で起動すれば、http://localhost:8025でメールクライアントが開けます。
メール送信先のSMTPサーバーを変更する
MailHogのSMTPサーバーに送信する関数を用意しました。
func (e *Email) SendEmailLocal(subject string, content string, user *orm.User) error { auth := smtp.PlainAuth("", "username", "password", "localhost") host := entity.GetLocalSMTPHost() message := []byte("From: " + emailFromName + ":" + emailFromAddress + "\r\n" + "To: " + user.Email + "\r\n" + "Subject: " + subject + "\r\n" + "\r\n" + content + "\r\n") err := smtp.SendMail( host, auth, emailFromAddress, []string{user.Email}, []byte(message), ) if err != nil { return internals.NewRequestBindError("[SendEmailLocal] send request error ", err) } return nil }
host
には、MailHogのSMTPサーバーである localhost:1025
がはいります。
ローカル開発時はこちらの関数でメールを送信するように書き換えれば・・・
メールがMailHogの方に届くことが確認できました。
これで仕様通り、想定したタイミングで想定したユーザーにメールが送られるかが開発しながらチェックできるようになりました。
また、メール周りの要件ってすぐ忘れてしまうので、「このタイミングでメール送られるっけ?」と思ったときに、ささっと操作してメールが送られるかの確認と内容のチェックが気軽できるのが嬉しいポイントです。
まとめ
送信したメールをブラウザで確認できるツールMailHogを勝手に導入してみました。
まだエンジニアの誰にも言っていないので、MailHogが使われるかは未定です。
デバッグすればええやんとか、こっちのツールの方が便利とか、あるかもしれないので、これをきっかけに、みんなで話し合いながら、メール周りの開発がもっと便利になればと思います。