[docker-composer] php-fpmのsendmailが使えない問題の解消法

2020年1月31日

テクノロジー

自称きれい好きなのに、部屋が散らかり放題の、ユゲタです。 ダメ人間ですね〜。部屋が散らかっていることに効率性は何も感じません。 そして、よくモノが無くなり、捜し物をしているので、年間でモノ探しをしている時間の合計をすると何時間になるのだろうか??? そんな僕のようなモノグサな人の御用達ツール「docker-compose」ですが、LAMP設定をした時に、PHPからメールが送信できないという事でハマった人も多いかと思います。 ネットでググッても、似たような問題で困っている書き込みが大量に見つかりました。 とりあえず、「docker-compose + nginx + php-fpm」の環境で、メールサーバーなどを介さずにそのままphpの機能だけで、メール送信できてしまうようにする方法が、色々調べて、設定して、ようやくできたので、その苦労の結果をブログに残しておきます。

ハマりポイント

まず基本的にdocker-composeを使用して、Dockerfileとymlファイルを使って環境構築する事を前提にしており、好き放題モジュールをインストールできる場合は、今回のやり方はあまり関係がなさそうなので、compose命の人は参考にしてみてください。 そんな、docker-composeでは、Dockerfileでapt-getやyumコマンドを使って、イメージOSに入っていないモジュールをインストールする事ができますが、 この問題に最初にぶち当たった時に、一番使い慣れている「postfix」をインストールしようとしたんですが、どうしてもインストール中に発生する対話式コマンドが、クリアできず断念。 次に、postfixイメージを起動して別OSとして立ち上げてphpからコネクションすればいいかと思ったんですが・・・ phpのsendmail_path設定でのアクセスがどうしてもうまくいかず断念。 次に、sendmailモジュールをインストールしてみたところ、対話方式問題は発生しない事がわかったので、ストレートなsendmail設定にしようとしたんですが、conf設定がなかなかうまくいかず、あえなく断念・・・ ネットで一番多かったやり方が、ssmtpを利用して構築する方法ですが、何故かssmtpをインストールしようとする場面で、リポジトリに存在しないというエラーが出て、その先に進めなくなり、断念・・・

msmtpで落ち着く・・・

どうやら、ssmtpはサービス名が変更されて「msmtp」という名称になっているという事がわかった。 そうとわかれば、下記のようにセットすることで、上手くインストールする事ができた。 ちなみに、macのdocker環境で構築していて、~/webフォルダにプログラムを入れて使用しています。 別環境の場合は、volumes設定を書き換えてお使いください。 /docker └ docker-compose.yml ├ web │ ├ Dockerfile │ ├ default.conf │ └ nginx.conf └ php74 ├ Dockerfile ├ php.ini ├ sendmail.ini └ update-exim4.conf version: '3' services: web: build: context: ./web/. ports: - "80:80" depends_on: - php74 volumes: - ~/web:/var/www/html - ~/web/_log/nginx:/var/log/nginx php74: build: context: ./php74/. ports: - "25:25" volumes: - ~/web:/var/www/html

web

FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf COPY default.conf /etc/nginx/conf.d/default.conf server { index index.php index.html; server_name localhost; root /var/www/html; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php74:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$uri - $is_args - args :::' '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }

php74

FROM php:7-fpm COPY php.ini /usr/local/etc/php/php.ini COPY sendmail.ini /usr/local/etc/php/conf.d/ COPY update-exim4.conf /etc/exim4/update-exim4.conf.conf RUN apt-get -y update && apt-get install -y msmtp mailutils [Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.language = Japanese mbstring.internal_encoding = UTF-8 sendmail_path = /usr/sbin/sendmail -t dc_eximconfig_configtype='internet' dc_other_hostnames='' dc_local_interfaces='127.0.0.1;::1' dc_readhost='exim4' dc_relay_domains='' dc_minimaldns='true' dc_relay_nets='' dc_smarthost='' CFILEMODE='644' dc_use_split_config='true' dc_hide_mailname='true' dc_mailname_in_oh='true' dc_localdelivery='mail_spool' # ビルド $ docker-compose build # 起動 $ docker-compose up -d <?php echo mb_send_mail( "hoge@example.com", "hage@example.com", "test : ".date("YmdHis"), "message!!!!" ); このプログラムにアクセスすれば、メールが送られてくるはずです。 ※自分の使っているメールアドレスに入れ替えて使ってね。

exim4がポイント

実は、msmtpをインストールしているんですが、使っているのは、exim4です。 もっとわかりやすくexim4をインストールすればいいだけかとも思ったんですが、同じ設定にしても動かず、msmtpでインストールされるexim4が便利なために、この仕様にしています。 もう少しコンパクトになる箇所があることに気がついた人は、こっそり教えてくだされ!!!

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。