Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

メール送信のテスト環境につかえる「MailHog」を試してみました。エンジニアの人は知っているのでしょうね。 MailHogなら前回構築したbookstackでもサクッと追加できます。

あくまでもテスト環境

メールを送信するSMTPやSendmailってちょっと大変ですよね。Gmailを利用するにもアプリ用パスワードを発行する必要がありますし、何かと設定と連携が面倒な気がする。

前提として、ここでは実際のメール送信ではなく、あくまでもテスト環境でローカルのブラウザでしか確認できません。そしてDocker利用になります。

実際にメール送信するには、メールサーバを組み込まないとなりません。今ならmsmtpでしょうか。別の機会にご紹介できればと考えています。

これならアドレスを間違えて送信してしまうリスクがないため、開発者のテスト環境なのも頷けます。昨今の情報漏洩とかイヤですからね。

bookstackに組み込んでみる

bookstackはメールで通知する機能があります。グループで利用するのに便利です。ここではMailHogを前回記事に追加していきます。

前回記事

ymlに追記

bookstackがDocker利用で動作しているものとして、docker-compose.ymlに追記していきます。

使用したDockerイメージは「jcalonso/mailhog」です。MailHogの書き換え版です。 どうも公式のMailHogは、arm64にだけ対応していません。調べたらいくつか出てきて、その中の1つを使いました。

追加したのは、bookstackアプリの環境に3行。 bookstackはSMTPとSendmailに対応していて、MailHogはsmtpになります。ポートはデフォルトで1025らしく、そのまま指定しました。

      - MAIL_DRIVER=smtp
      - MAIL_HOST=mailhog
      - MAIL_PORT=1025

新たにmailをサービス内に追加。

  mail:
    image: jcalonso/mailhog
    container_name: mailhog
    ports:
      - "8025:8025"
    environment:
      MH_STORAGE: maildir
      MH_MAILDIR_PATH: /tmp
    volumes:
      - ./maildir:/tmp

内容を保持しながらバインドマウントするのに、新たにVolumesを記載しないとならないみたいで、最上段か最下段かに追記します。

volumes:
  maildir: {}

ちなみに./から始まっている場所は、プロジェクトとして展開したdocker-compose.ymlの存在するディレクトリです。

改めて全部表示するとこうなります。

bookstackのdocker-compose.ymlはこちら

version: "2"
services:
#bookstackアプリ
  bookstack:
    image: lscr.io/linuxserver/bookstack
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - APP_URL=http://bookstackapp.local:6875
      - DB_HOST=bookstack_db
      - DB_USER=bookstack
      - DB_PASS=bookstack_pass
      - DB_DATABASE=bookstackapp
      - MAIL_DRIVER=smtp
      - MAIL_HOST=mailhog
      - MAIL_PORT=1025
    volumes:
      - ./bookstack_app_data:/config
    ports:
      - 6875:80
    restart: unless-stopped
    depends_on:
      - bookstack_db
#データベースMariadb
  bookstack_db:
    image: lscr.io/linuxserver/mariadb
    container_name: bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=root_pass
      - TZ=Asia/Tokyo
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=bookstack_pass
    volumes:
      - ./bookstack_db_data:/config
    restart: unless-stopped
#メール送信MailHog
  mail:
    image: jcalonso/mailhog
    container_name: mailhog
    ports:
      - "8025:8025"
    environment:
      MH_STORAGE: maildir
      MH_MAILDIR_PATH: /tmp
    volumes:
      - ./maildir:/tmp

volumes:
  maildir: {}
はてな? はてな?
bookstack_app_dataも./bookstack_db_dataもVolumesに記載した方がいいのかな?

後から追加したので、一旦downさせ、buildコマンド後に再度upしました。

docker compose down
docker compose build
docker compose up -d

■Pi 5は8GBモデルがオススメ

確認してみる

bookstack側の設定にテスト送信できるボタンがあります。(設定->メンテナンス)

メール送信できる機能をインストールしていないとエラーになりますが、今回の追加後に指定したポートである8025でメールの結果が表示されていれば成功です。

何も設定していない場合

ブラウザでIPアドレス:8025を表示してみると、受信箱にちゃんと入っていますね。

他でも使えそう

今回はbookstackがMailHogに対応していましたから、とても簡単に追加できました。あくまでもローカルで送受信しているに過ぎないため、メールアドレスは実在していないドメインでも問題ありません。

非エンジニアでも、メール送信させるコードを触るなら、一旦はテストで使いたいなと思いました。1人で扱う程度ならこれでいいかなとも思います。

もしもMailHogを個別に扱うなら、ポート番号やアプリの環境(.env)を変更しないとならないと思われます。bookstackアプリ側の対応を読むと、SMTPやSendmailの設定方法が載っています。

送信メールのMIMEを読むと、Unknown type (2 bytes)とはなっていましたが、日本語も問題無いですね。

そういえば、bookstackは日本語の表示には対応しているけど、PDFは出力で文字化けします。これは対応していません。

次回は本当に送受信できるメールサーバの組み込みにトライしてみようと思います。