開発環境で送信したメールを確認するためにMailHogを導入しました(勝手に)

こんにちは、カミナシの@tomiです。

開発環境で送信したメールを確認するためにMailHogを導入してみました。 MailHogとは送信したメールをブラウザで確認できるツールです。

f:id:kaminashi-developer:20210224112022p:plain

導入のきっかけ

以前、Ruby on Railsで開発している際に、letter_openerという送信したメールをブラウザで確認できるgemを使っていて、メール周りの開発が捗りました。

Golangでもメールが送信されたかを確認する方法を探してたらMailHogというツールを見つけたので、とりあえず導入してみました。(勝手にプルリクを出した)

導入方法

導入はとても簡単で、

  • 公開されているDockerイメージでコンテナを作成する
  • アプリ側のメール送信先SMTPサーバーを変更する

この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でメールクライアントが開けます。

f:id:kaminashi-developer:20210224112048p:plain

メール送信先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がはいります。

ローカル開発時はこちらの関数でメールを送信するように書き換えれば・・・

f:id:kaminashi-developer:20210224112110p:plain

メールがMailHogの方に届くことが確認できました。

これで仕様通り、想定したタイミングで想定したユーザーにメールが送られるかが開発しながらチェックできるようになりました。

また、メール周りの要件ってすぐ忘れてしまうので、「このタイミングでメール送られるっけ?」と思ったときに、ささっと操作してメールが送られるかの確認と内容のチェックが気軽できるのが嬉しいポイントです。

まとめ

送信したメールをブラウザで確認できるツールMailHogを勝手に導入してみました。

まだエンジニアの誰にも言っていないので、MailHogが使われるかは未定です。

デバッグすればええやんとか、こっちのツールの方が便利とか、あるかもしれないので、これをきっかけに、みんなで話し合いながら、メール周りの開発がもっと便利になればと思います。