Docker イメージを利用したローカル開発環境向けメールサーバ構築のすゝめ

ebi です。 弊社では Rails だけでなく、 WordPress 等を利用した PHP 環境、WordPress 等のフレームワークを利用するまでもなく、素の PHP で構成されるページを作成、保守することもあります。 往々にして LP だったり、コーポレートサイトやサービスサイトが中心で、サイト上からのメールの送信を伴う問い合わせフォームがセットとなっていることが多いです。 Rails だとメール送信は Action Mailer を利用して、メール受信は letter_opener 等を利用すればすぐにそれっぽい画面で確認できて便利だな、と思っていたのですが、そこそこ前から Rails 以外のプロジェクトでも、 Docker を利用して letter_opener 相当の環境を手元に用意しているのが便利なので今回はそれを紹介します。 これまでの話 ところで、そもそもこれまではどうしてたのよ、な話を先にしておくと Gmail アカウント等を利用し、外部の SMTP サーバーを経由する設定をローカル開発環境向けに書く 実際のメールサーバを使って実際のメールを送信できる、至極真っ当な手段だとは思うのですが、一つ大きな問題があって、 本番設定のメール送信先設定を引き継いだままだと本番設定の宛先にメールを送ってしまいます。 もっと分かりやすく言うと、うっかりお客さん宛に手元のローカル開発環境からのテスト送信のメールを送ってしまう事故が発生する可能性があるんですね(弁明しておくと、通常はこう言う危ない設定とかは真っ先に確認して潰すので大丈夫なのですが、事故が起きかねないリスクをそれなりに孕んでいるという話です)。 そのため、対策として以下などに取り組んだりしています。 1. 自前でメール送信のコードを書いている場合は、送信先の設定をハードコードしない 定数( .gitignore されるファイルに置くといい )を参照するようにし、 GitLab 等に共有する開発環境向けのコードではデフォルトを実際にメールが届かないサンプルの宛先にしておく。 本番環境上のサーバ内の定数定義を行うファイル中でのみ、有効な設定を記述する。 2. WordPress 等のプラグインを利用したメールフォームの場合は、DB 上に保存されているメール送信先の設定変更を初期の環境構築の一環でやる サイト URL のドメイン置換等の初期構築を行う一環で、同様にメールアドレスのデータを含む設定テーブル内でのメールアドレスの置換を行うようにします(本題からズレるので詳細は割愛)。 安全化のためのメールアドレス置換までを含めた初期構築用のスクリプトを共有し、皆がそれを使うことで安全なローカル開発環境の構築を担保する。 (あからさまに個人情報を含むテーブルはそもそも dump する対象には含めない、でも事足りるのですが管理者アカウント系はあった方がよいのでこうする) ステージング環境向けにブラックホールメールサーバが適用されている ので、そっちの環境を積極的に利用していきましょう。と言う場合です。今回作ろうとしている安全にメールが確認できる環境が、ステージング環境に既にあるケースですね。 ブラックホールメールサーバの中身の話は この記事 や この記事 をご覧ください(今気付いたけど、 BPS で現在運用されている yaasita さんのブラックホールメールサーバは Docker 版 が公開されていますね)。 なお、弊社社員の場合は、このサーバが社内ネットワーク中で運用されているので、ローカル開発環境向けの設定でこのサーバを利用することもできるようになっているはずです。 事前準備 記事の本題に入っていきます。 後半の内容に則したものになりますが、 GitHub にも置いておく ので、そちらも適宜ご活用ください。 サンプルコード例 メール送信用のコードについて詳細を語るのは本筋ではない(書くならちゃんと書かないと有害記事になっちゃうからね!)ので、以下の滅茶簡略化コードで進めていきます。mail コマンドの例は リファレンス から拝借。 <h1>Techracho メール送信サンプル</h1> <form action=”./techracho-sample-mail.php”> <input type=”submit” value=”送信する” /> </form> techracho-sample-mail.php <?php $to = ‘nobody@example.com’; $subject = ‘the subject’; $message = ‘hello’; $headers = ‘From: webmaster@example.com’; mail($to, $subject, $message, $headers); ?> <h1>送信できたかな……</h1> また、環境構築を進めていく際には phpinfo() で適時現状を確認していきます。主に sendmail_path 。 info.php <?php phpinfo(); Docker で立ち上げるメールサーバ 今回は MailDev を採用した例を書きますが、もちろん、その他サービスの利用に応用してもらっても特に問題ないはずです。 また、 MailDev 自体は本来 node 環境だけでも動くもののようです。このようにメールサーバの立ち上げに、必ずしも Docker が必要なわけではありませんので、各人の好みや環境に合わせて何を使うか選択していくのが良いと思います。 参考記事: ローカルに開発用メールサーバーを立ち上げる - Qiita ISO-2022-JP に対応した maildev の dockerイメージ を作る - Qiita サンプル例その1: XAMPP 環境 僕が愛用する Windows で Web 開発の基本の PHP 環境を構築する際はやはり XAMPP にお世話になっていたので、まずは XAMPP を例にしてサンプル例を進めていきます。 XAMPP だと mailtodisk を使う方法もあったりはするのですが、実際のメールサーバを使っての送信により近い環境を作りたいですよね。 1. 初期状態 phpinfo 送信結果 Warning: mail(): Failed to connect to mailserver at “localhost” port 25, … Continue reading Docker イメージを利用したローカル開発環境向けメールサーバ構築のすゝめ