PHP製メールフォームプログラムでGmail宛にメールが届かない問題への対応について

概要

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を指定して成功しました。

タイトルとURLをコピーしました