はじめに
少々レガシーかもしれませんがDocker/CodeIgniter3を使ってローカル環境で開発をしている際、「メール配信処理もMailpitを利用してローカル環境内で完結させたい」というケースに対するTIPSです。ドキュメントや参考事例が見当たらなかったので備忘録です。
Laravel
LaravelではMailpitが標準でサポートされており、まずDockerでイメージを指定してコンテナをデプロイします。
mailpit:
image: axllent/mailpit:v1.8
container_name: mailpit
ports:
- "8025:8025"
- "1025:1025"
environment:
MP_DATA_FILE: /tmp/mailpit.db
volumes:
- /path/to/local/development_project/docker/mailpit/tmp:/tmp
次にLaravel側の.envファイルで以下のように指定するだけで簡単に導入できます。
MAIL_HOST=mailpit
ローカル環境のサーバからメールを送信するとMailpit(標準では http://localhost:8025 にWebのUIが立ち上がる)にメールが届きます。なんと便利…。
CodeIgniter3
対してCoodeIgniter3ではキュメントやソースコード上ではMailpitに対応しているような記述はありませんでした。ですがメール送信を担当するEmailクラスのconfigを確認するとprotocol
として以下が選択できるようです。
mail、sendmail、または smtp
WebサーバにSendmail/PostfixなどMTAがインストールされていればエイリアスが効いてsendmailで問題ないと思いますが、別のサーバのSMTPを使いたい場合はsmtpを使うのが良さそうです。
smtp_host
でSMTPサーバを指定でます。マニュアルには「SMTP サーバのアドレス」とありますが、ここではDockerで指定したホスト名であるmailpitを、smtp_port
はMailpitのsmtp inboundポートである1025番を指定します。
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'mailpit';
$config['smtp_port'] = '1025';
この設定でテストしていたのですが、CodeIngiter側でエラーが発生してしまいました。
EHLO〜MAIL FORM〜TOまではうまくいっているのですが、どうも本文データを受け渡す際にコケているようです。
<pre>data: 354 Start mail input; end with <CR><LF>.<CR><LF></pre>
configの設定状況を確認するとcrlf
newline
ともにLF(\n)になっており、Mailpit側が要求するCRLF(\r\n)での区切りとマッチしないためと思われます。
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'mailpit';
$config['smtp_port'] = '1025';
+$config['crlf'] = "\r\n";
+$config['newline'] = "\r\n";
上記のように上書き設定を追記してテストしたところ無事にMailpitへメールは配送されました。これでローカル環境内でのメールテストが可能になります。地味に便利です…。
CodeIgniter4
Emailクラスのconfig周りを見る限り、若干項目のラベルが違いますが同じような設定で実現できるのではないかと思います。(未検証)