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を導入すればいけるかも!?(ワシは駄目じゃった)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9ZG9ja2VyJUUzJTgyJUIzJUUzJTgzJUIzJUUzJTgzJTg2JUUzJTgzJThBJUUzJTgxJUE3UEhQJUUzJTgxJThCJUUzJTgyJTg5JUUzJTgxJUFFJUUzJTgzJUExJUUzJTgzJUJDJUUzJTgzJUFCJUU5JTgwJTgxJUU0JUJGJUExJUUzJTgxJUE4aHR0cHMlRTMlODElQUIlRTUlQUYlQkUlRTUlQkYlOUMlRTMlODElOTklRTMlODIlOEImdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTJjN2ZmYmE0YzI1YzdkOGEyZGFhODQ2ODFhYTFkMTJk&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwa2lub2xlYWYmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTA1NjFiNWNmZDMxYjEwMDdhODVhMDQ4NGE2MjY4NzRk&blend-x=142&blend-y=491&blend-mode=normal&s=75a342b4731e98525b63db038397f7f8)
この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見た感じ。
コメント