LoginSignup
0
0

More than 1 year has passed since last update.

PHP の Docker に Postfix を入れてホストにリレーする

Posted at

PHP の Docker でメールを送信したい

Docker上で PHP アプリケーションの開発をしていて、PHP からメールを送信する必要が出てきました。
そのままだと、Docker の PHP にはメールを送信する仕組みが含まれていませんので、同じ Docker 内に Postfix を入れて、ホストにリレーすることにしました。
ベースの Docker イメージは php:8.1-apache です。

併せて Vim やネットワーク系のコマンド(ping, curl など)、メール送信確認のための mail コマンドもインストールしておきます。

Dockerfile
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 の設定を書き換えます。

Dockerfile つづき
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" なのでやらなくていいかもですが、念のため。

Dockerfile つづき
# 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 に指定します。

startup.sh
#!/bin/sh

/etc/init.d/postfix start
/usr/local/bin/apache2-foreground
Dockerfile つづき
COPY startup.sh /

CMD sh /startup.sh/etc/postfix/main.cf

この Dockerfile を元にコンテナを作成すると、 Apache+PHP で Postfix が動くようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0