WebサーバーのPHPプログラムから、ユーザーからの問い合わせ等をメール送信しているが、迷惑メールとなって届かないことが多い。最近、GMailのスパム判定がさらに厳しくなっているかんじがする。
1.従来の方法
PHP標準の以下のメール関数を使って実装。
(mail)https://www.php.net/manual/ja/function.mail.php
(mb-send-mail)https://www.php.net/manual/ja/function.mb-send-mail.php
SMTPサーバーの指定はできず、サーバーのメール転送エージェント(MTA:sendmailあるいはPostfix)から送信される。Webサーバーは、サービスのドメインのMXレコードに指定されているメールサーバー (以下「正式メールサーバー」) ではないので、SPFレコードにWebサーバーのアドレスを追加しても、最近は迷惑メールの判断されることが増えてきた。
2.改善策
サービス提供しているドメインの正式メールサーバー経由でメール送信するように修正した。方法として、1)メールリレーの指定をやってみたが、上手くいかない部分もあったので、2)STMPサーバーからの送信とした。
2.1 メールリレーの指定
PHPプログラムは変更せずに、サーバーのMTAから、正式メールサーバーを経由(メールリレー)して送る方法を試してみた。
CentOSでsendmailから、SMTP認証を利用して正式メールサーバー経由で送る場合の設定は、以下が参考になる。
https://access.redhat.com/ja/solutions/2733021
メールサーバーとしてXServerのメールサーバーを利用している場合、SPF_SOFTFAILとなる問題がある。
https://darekoi.blogspot.com/2018/05/xserver-spf.html
ウィルスチェックサーバーをSPFに追加すれば、改善するかもしれないが、保証はない。↓
(2021/08/14)
ウィルスチェックサーバーをSPFに追加してみたころ、以下となりGmailでは迷惑メールのまま送信できなかったが、他のメールには届いた。
tests=SPF_HELO_NONE,SPF_PASS
2.2 正式メールサーバーからの送信
PHPプログラムから、サーバーのMTAを経由せず、SMTP認証を利用して 正式メールサーバーから送るように変更した。
SMTP認証でのメール送信としては、PHPMailerが広く使われているよう。
https://github.com/PHPMailer/PHPMailer
検索すると、使い方について説明している日本語ページはあるが、古いものも多いので、正式なGitHubのサンプル見る方が良いと思う。英語が苦手でも、サンプルプログラム見れば使い方は簡単にわかる。
https://github.com/PHPMailer/PHPMailer#a-simple-example
ただし、サンプルは多言語に対応していないので、以下の追加は必要。
$mail->CharSet = "utf-8";
$mail->Encoding = "base64";
あと、正式版にする時には、以下を変更。
//$mail->SMTPDebug = SMTP::DEBUG_SERVER; //デバッグ
//$mail->SMTPDebug = SMTP::DEBUG_CONNECTION; //接続に失敗する場合のデバッグ
$mail->SMTPDebug = SMTP::DEBUG_OFF;
3.結論
迷惑メールにならないサーバーPHPプログラムからのメール送信には、やはり正式にSMTP認証してメールサーバーから送るのが一番かと。DNSにSPF設定してとか、色々やったけど、さっさとプログラム直せばよかった。