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
0 件のコメント:
コメントを投稿