PHP の Docker でメールを送信したい
Docker上で PHP アプリケーションの開発をしていて、PHP からメールを送信する必要が出てきました。
そのままだと、Docker の PHP にはメールを送信する仕組みが含まれていませんので、同じ Docker 内に Postfix を入れて、ホストにリレーすることにしました。
ベースの Docker イメージは php:8.1-apache です。
併せて Vim やネットワーク系のコマンド(ping, curl など)、メール送信確認のための mail コマンドもインストールしておきます。
FROM php:8.1-apache
# package install
RUN apt-get update && \
apt-get -y upgrade && \
apt-get install -y \
vim \
iproute2 \
iputils-ping \
curl \
mailutils \
&& docker-php-ext-install pdo pdo_mysql && apt-get clean
Postfix のインストールと設定
Postfix のインストールには少し工夫が必要です。
そのままだと、インストール中に質問が入って止まってしまうので、
DEBIAN_FRONTEND=noninteractive
を指定して、インストール中に処理が止まらないようにします。
そして、 postfix の設定ファイルに、メールのリレー先を設定します。
今回はいったんホストマシンに送りつけて、ホストマシンからさらに外部のメールサーバーにリレーすることにしたので、 Docker からのリレー先はホストマシン (host.docker.internal) としました。
/etc/postfix/main.cf の relayhost の設定を書き換えます。
RUN DEBIAN_FRONTEND=noninteractive apt install postfix -y && \
sed -i -E 's/^(#| )*relayhost( )*=.*$/relayhost = host.docker.internal/g' /etc/postfix/main.cf
PHP の設定
PHP の設定については、sendmail_path を適宜設定します。
一応デフォルトは "sendmail -t -i" なのでやらなくていいかもですが、念のため。
# php.ini
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" && \
sed -i -E 's/^(;| )*sendmail_path( )*=.*$/sendmail_path = \"sendmail -t -i\"/g' /usr/local/etc/php/php.ini
CMD は一つだけ
Dockerfile の CMD 命令は一つだけしか指定できないので、 Apache と Postfix を両方起動するために、シェルスクリプトを書いてそこに両方のコマンドを記述し、そのスクリプトを CMD に指定します。
#!/bin/sh
/etc/init.d/postfix start
/usr/local/bin/apache2-foreground
COPY startup.sh /
CMD sh /startup.sh/etc/postfix/main.cf
この Dockerfile を元にコンテナを作成すると、 Apache+PHP で Postfix が動くようになりました。