概要
GoogleがGmailへのスパム対策として、送信者に対してSPF, DKIM, DMARCの設定を必須とするルールの施行を始めた頃から、ウェブサーバー上で動作しているPHPのメールフォームからGmail宛にメールが届かなくなりました。
迷惑メールにも入っておらず、Gmail以外には送信されているので、送信処理自体は成功しているものの、Gmail側で受け取り拒否されているような状況でした。
対応
mail関数に”-f”オプションを付ける
ネット調べると、「mb_send_mail関数の第5引数に”-f user@example.com”を記述してReturn-Pathを指定すると良い」という文献があります。
該当のプログラムはmail関数でしたが、mb_send_mail関数も内部的にはmail関数を呼び出しているようで、同じように対応してみたところ、届くようにはなったものの、迷惑メールフォルダに振り分けられてしまいました。
SMTP接続で送る
送信処理の部分のみ、PHPMailerの機能を使ってSMTPでメールサーバーに繋いで送信すると、問題無く届きました。
GitHub - PHPMailer/PHPMailer: The classic email sending library for PHP
The classic email sending library for PHP. Contribute to PHPMailer/PHPMailer development by creating an account on GitHu...
メールフォームプログラムと同じ場所または任意の場所にPHPMailerを配置し、ファイルをインクルードしてPHPMailerクラスのプロパティや関数を呼び出すだけです。
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
require('PHPMailer/src/PHPMailer.php');
require('PHPMailer/src/Exception.php');
require('PHPMailer/src/SMTP.php');
$userPHPMailer = true; // 念の為、切り替え出来るように
// 略(メールフォームの色々な処理)
// メールフォームの送信処理
if (!userPHPMailer) {
// 略
mail($to, $subject, $message, $header); // デフォルトの送信方法
} else {
$mail = new PHPMailer(true);
// 略(PHPMailerの設定)
$mail->send(); // SMTPによる送信
}
接続が上手くいかない場合、大抵は認証方法が間違っています。
私の場合、ポートが465でTLSを指定しましたが、接続が失敗したのでSSLを指定して成功しました。