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を導入すればいけるかも!?(ワシは駄目じゃった)
この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見た感じ。
コメント