
ローカルでメール送信がしたい
Djangoでメール送信機能を実装するために、ローカルでテストする方法を調べました。
Railsだとletter_opener_webがあるので楽ですが、Djangoではどうなのでしょうか?
MailCatcherを利用
Djangoではletter_opener_webのようなパッケージは見つかりませんでした。
どうしようかなと考えていたところ、以前、別のシステムのステージング環境でMailCatcherを利用していたことを思い出しました。
MailCatcher用のコンテナを立てて、そのコンテナをSMTPサーバとして指定することで簡単にメール送信環境が構築できると思います。
MailCatcherの設定
ではMailCatcherを利用するための設定を行っていきます。
MailCatcherコンテナイメージ
DockerHubで検索してみるとMailCatcherのコンテナイメージがありました。
検索結果の一番上に出てきたこちらを利用しようと思います。
docker-compose.ymlの設定
ローカルでコンテナを起動するようdocker-compose.ymlを設定していきます。
MailCatcherコンテナの設定
設定自体はとてもシンプルです。現在はwebとdbのコンテナを起動するようにしていますが、そのならびにsmtpというホスト名でコンテナを追加するだけです。
1 | services: |
設定したこととしては、imageの指定と、ポートの指定のみです。1080はメールを確認する際のWebインターフェースのポート番号、1025はSMTPで利用するポート番号になっています。
webコンテナの設定
webコンテナでは、SMTPのエンドポイントとポート番号を指定する必要があります。
STMPのエンドポイントはsmtp、ポート番号は1025になります。
1 | web: |
これでコンテナの設定は完了です。
Djangoの設定
Djangoでメール送信設定を行います。
Djangoのメール送信設定については、SendGridのページがよくまとまっていたので参考にしました。
settings.pyに以下を追記します。
1 | EMAIL_HOST = os.getenv('EMAIL_HOST', '') |
これでMailCatcherを利用するための設定は完了です。
メールの送信テスト
ではメール送信ができるかどうかテストを行います。
コンテナの起動
docker-compose upでsmtpコンテナを起動しておきます。
1 | $ docker-compose up |
次に実際にメールを送信します。shell_plusを利用して、メール送信関数を実行します。
1 | $ docker-compose run --rm web python manage.py shell_plus |
1がかえってきました。ドキュメントをみると、
1 | The return value will be the number of successfully delivered messages (which can be 0 or 1 since it can only send one message). |
と書かれていて、配送できたメールの数が戻り値になっているようです。今回は一通しか送っていないため、1がかえってきています。受信者が増えても配送できたメッセージの数なので、1メッセージであれば1が返ってきます。
WebUIでメールの確認
無事メールが配信されているかを確認します。 http://localhost:1080 にアクセスします。

メールが配送できていることを確認できました。
まとめ
Djangoのローカル開発環境でメール送信とその確認を行う方法を記載しました。
コンテナのおかげでローカル開発環境は簡単に拡張できて本当にありがたいです。
次回はメール本文の記述方法について記載したいと思います。