PHPでメールを送信したいだけの時の最小設定

2017年10月19日

PHP テクノロジー プログラミング メール

WEBサービスを作っている時にメールを送るフローになる事は少なくない。 アカウント登録をさせるシステムだと、メールとハッシュキーを使って、認証を行ったり、 システム上のアラートやお知らせは、サービス利用者にメールで送付したり、 バッチ処理をした時のwarning情報をサービス管理者に送ったり・・・ slackなどのチャットbotにしてもいいんですが、mailはまだまだ現役の手法のようです。 そんなメール送信は、PHPを使う場合、sendmailに繋げなくてはいけないので、sendmailモジュールをインストールして設定をしなければいけないんですが、 sendmailの設定をググると、ガッツリ送受信メールサーバーの設定を解説しているページが多いので、PHPでメールを送信するだけのsendmail設定をメモしておきます。 ちなみに、今回は主流のPostfixを使って行いますので、他のモジュール希望の人は、記事要望をメールでください。 ※コメントでもいいです・・・

今回使用する環境

開発環境やテスト環境でサクッとセットしたいので、Dockerを基準に考えています。
Mac + Docker Ubuntu16 Nginx PHP7.0
Linuxであれば、そんなに設定は変わらないと思うんですが、とりあえず確認済み環境ということで・・・

Postfixのインストール

なんの迷いもなく、下記コマンドで一発インストール完了です。 途中で幾つか質問されますが、適当に答えておきましょう。 $ apt-get install postfix

main.cfの設定

基本的にインストールが完了すれば、「/etc/postfix/main.cf」の設定を行えば準備完了ですが、postfixをインストールした時に、main.cfが定位置に存在しない事があります。 これは、postfixの設定ファイルは、デフォルトテンプレートとして隔離保存されています。 必用があれば、下記pathよりコピーして使ってください。
/usr/share/postfix/ - main.cf - master.cf ...
ただし、下記データをmain.cfとして直接書き込んでもうまく動くと思います。

基本設定データ /etc/postfix/main.cf

compatibility_level = 2 command_directory = /usr/sbin daemon_directory = /usr/lib/postfix/sbin data_directory = /var/lib/postfix unknown_local_recipient_reject_code = 550 mynetworks = 127.0.0.0/8 smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 home_mailbox = Maildir/ mydestination = $myhostname, localhost.$mydomain, localhost sendmail_path = /usr/sbin/sendmail newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /etc/postfix readme_directory = /usr/share/doc/postfix inet_protocols = ipv4 設定したら、postfixの再起動をしておきましょう。 $ /etc/init.d/postfix restart エラーが出なければ成功しているはずです。

送信テスト(PHP)

PHPには、mail()とmb_mail_send()の2つのメール送信関数がありますが、基本的には同じものです。 mbがついている方がマルチバイトの扱いがうまくいくと思われがちですが、ちゃんとヘッダを書いてあげればどちらも変わりません。 念のため、2種類の送信を書いておくので2通のメールが届けば成功という事ですね。 <?php $to = "hoge@example.com" $subject = "test"; $message = "test-message"; mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_send_mail($to , $subject , $message); $to = "hoge@example.com"; $subject = 'the subject'; $message = 'hello'; $headers = 'From: webmaster@example.com' . "\r\n" . 'Reply-To: webmaster@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers); ?> 上記PHPファイルを実行させると・・・メール届きますか?

注意する点

もしすでにpostfix以外のsendmailツールがインストールされている場合は要注意です。 sendmail , mailqなどがすでにインストールされている場合は、切り替え作業が必用になります。 切り替え手順は今回は書かないので、Dockerであれば、新たにimageを作ることをオススメします。

追記

Dockerシステム内には以下のmain.cfを設置したらPHPでメール送信できるようになりました。 compatibility_level = 2 command_directory = /usr/sbin daemon_directory = /usr/lib/postfix/sbin data_directory = /var/lib/postfix unknown_local_recipient_reject_code = 550 mynetworks = 172.17.0.0/16, 127.0.0.0/8 smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/postfix newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /etc/postfix readme_directory = /usr/share/doc/postfix inet_protocols = ipv4

このブログを検索

ごあいさつ

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