Dockerのphp:8.1-apacheコンテナではmail()やmb_send_mail()によるメール送信ができなかった | クズリーマンのカス備忘録

Dockerのphp:8.1-apacheコンテナではmail()やmb_send_mail()によるメール送信ができなかった

docker-logo docker
スポンサーリンク

mb_send_mail()を実行しようとすると、sendmailが入っていないエラーが出る

mb_send_mail()を含むPHPスクリプトを実行しようとすると(問い合わせフォームからのメール送信)、以下のエラーが出力されて、メールが送信されない。

Warning: mb_send_mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i' in PHPのファイルPath

postfixやsendmailなどのMTAがインストールされていないことが原因。

php:8.1-apacheコンテナではaptやapt-getが使えなかった。

postfixやsendmailなどのMTAをインストールしようと、
aptや
apt-getなどの パッケージャーを使おうとするも、エラーが出て使えない。

その原因は公開鍵が利用できない為によるものだが、公開鍵を追加しようと、以下のようなコマンドを実行するも、これもうまく行かない。

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9

ソースからコンパイルして入れようかと思ったが、めんどくさそうじゃった。

MailHogとmhsendmailを導入すればいけるかも!?(ワシは駄目じゃった)

dockerコンテナでPHPからのメール送信とhttpsに対応する - Qiita
Docker を使ってローカル環境をサクッと手元に用意しようとして、不便(?)だった箇所をどうにかしようと色々試行錯誤したメモです。環境構成コンテナはDocker Hubの公式リポジトリから持…

このQiitaの記事がかなりいい線いってたかんじじゃった。

MailHogというものを、Dockerのコンテナで用意し、
それをMTA代わりに使う。

橋渡しとしてmhsendmailというものを導入するというもの。

まず、MailHogを導入するためにdocker-compose.ymlに追記する。

mailhog:
    image: mailhog/mailhog
    ports:
      - "8025:8025"
      - "1025:1025"

そして、PHPがあるコンテナに対し、mhsendmail導入の記述をする。

RUN curl -sSLO https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 \
    && chmod +x mhsendmail_linux_amd64 \
    && mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail \
    && echo 'sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"' > /usr/local/etc/php/conf.d/sendmail.ini

PHPのコンテナの中で直接コマンド叩いても良い。ワシはそうやった。

そしたら使えるかと思いきや、
ワシが担当しとったフォームのmb_send_mail()からは、とうとうメールが飛ぶことはなかった。

エラーが出なかったからもしかしたらひと工夫で使えたかもしれん。

もうOSのコンテナ入れてその中に愚直に作っちゃうっ!

Rocky Linux9.2のコンテナを用意して、

  • Apache2.4
  • php8.1 (module install)
  • php-fpm
  • postfix

をインストールじゃい!

postfixの設定についてはsendgridさんの記事がシンプルで大変良かった。

vi /etc/postfix/main.cf

設定内容は以下の通り。

mail_owner=_postfix
setgid_group=_postdrop
myhostname=localhost.localdomain
compatibility_level = 2

myhostnameが特に重要で、自身のサーバのドメインを設定してね。とのこと。

まとめ

Dockerでmb_send_mail()の仕組みはあんまりポピュラーじゃないのかな?
そんなに世の中に用意されてる感じじゃなかったね。
結構同じことで悩んでる人が多い印象だった。Web見た感じ。

コメント

タイトルとURLをコピーしました