mb_send_mailでgmailやicloudのアドレスに届かない

投稿者: | 2022年5月31日

トラブルの内容

あるお客さんからPHP製のフォームからの確認メールがgmailやicloudのアドレスに届かないとのこと。メールログを確認したところ次のようになってました。

・gmailのログ(抜粋)

to=<(ユーザーのアドレス)@gmail.com>, relay=gmail-smtp-in.l.google.com[142.251.8.27]:25, delay=1.4, delays=0.02/0.01/0.56/0.76, dsn=5.7.26, status=bounced (host gmail-smtp-in.l.google.com[142.251.8.27] said: 550-5.7.26 Unauthenticated email from (顧客のドメイン) is not accepted due to 550-5.7.26 domain's DMARC policy. Please contact the administrator of 550-5.7.26 (顧客のドメイン) domain if this was a legitimate mail. Please visit 550-5.7.26  https://support.google.com/mail/answer/2451690 to learn about the 550 5.7.26 DMARC initiative. 

・icloudのログ(抜粋)

to=<(ユーザーのアドレス)@icloud.com>, relay=mx01.mail.icloud.com[17.57.154.23]:25, delay=3.5, delays=0.01/0/0.35/3.1, dsn=5.7.1, status=bounced (host mx01.mail.icloud.com[17.57.154.23] said: 554 5.7.1 Your message was rejected due to (顧客のドメイン)'s DMARC policy. See https://support.apple.com/en-us/HT204137 for info (in reply to end of DATA command))

SPFが原因ではない

最初はSPFが原因かと思い、DNSをいろいろいじっていましたが一向に改善されませんでした。そこで問題の切り分けのため、まず下記のようにsendmailコマンドを試してみました。aaa@bbb.comとccc@gmail.comはダミーです。

echo test | sendmail -f aaa@bbb.com ccc@gmail.com

これは「aaa@bbb.com から ccc@gmail.com 宛に test という内容のメールを送る」ということになるのですが、正常に送信されました。つまりSPFの設定自体は問題ではなく、PHPのコーディングに問題があるということが分かりました。 

解決

あれこれ調べていると下記のページを発見しました。

https://qiita.com/f_uto/items/aa8a3ab915fb09b97256

mb_send_mailの第五引数に「-f(送信元のメールアドレス)」をセットすればよいとのこと。
そこで下記のように記述しました。$fromMailには送信元のメールアドレスがセットされています。

$addParam = '-f' . $fromMail;
mb_send_mail($to, $subject, $body, $header, $appParam);

この内容で実行したところ、正常にgmailやicloudのアドレスにも送信されるようになりました。
情報をqiitaで公開してくれた方に感謝です m(_ _)m