WordPressメールフォームからGmailに届かないとき、エンベロープFromとSPFについて見直そう
Gmailに届かない問題
「ある日から急に、ホームページのフォームからの送信がGmailでメール受信できなくなった」と相談をうける事がよくある。
古いサイトでメールフォームの設定が適切でなく、メールフォームからのメール送信が、なりすましメールやスパム判定されてしまうからだ。
これまでもGmailは送信者ごとに随時判定を行ってきたが、ついに2024年2月1日以降、Gmailにメールを送信するすべての送信者は、SPF等のメール認証が義務付けられる。
2024 年 2 月 1 日以降、Gmail アカウントにメールを送信するすべての送信者は、このセクションに示す要件を満たしている必要があります。
https://support.google.com/mail/answer/81126?sjid=3209894911023463548-AP
- ドメインに SPF または DKIM メール認証を設定します。
- 送信元のドメインまたは IP に、有効な正引きおよび逆引き DNS レコード(PTR レコードとも呼ばれます)があることを確認します。
- Postmaster Tools で報告される迷惑メール率を 0.10% 未満に維持し、迷惑メール率が決して 0.30% 以上にならないようにします。
- Internet Message Format 標準(RFC 5322)に準拠する形式でメールを作成します。
米Yahooも2024年の第1四半期より同等のポリシーが適用される。
エンベロープFromとヘッダFromの一致
そもそも今回のGmailのガイドラインうんぬん以前に、Wordpressフォームの送信元(ヘッダFrom)にGmailを設定してしまっているケースなど、表示上の送信元である「ヘッダFrom」と実際の送信元である「エンベロープFrom※」が一致しない場合、DMARCに準拠していない為メールの信頼性が下がると言われている。
※厳密には、エンベロープFrom(Return-Path)は送信者側が設定するエラー通知先アドレスのこと。
Gmailの場合は、受信したメールの「To自分▼」をクリックすると送信元の詳細が表示される。From:
がヘッダFromで、送信元:
がエンベロープFromだ。このメールでは、どちらもjp90.mixhost.jp
となっており、エンベロープFromとヘッダFromが一致している。
Gmailはもちろん、キャリア(docomo/au/softbank)のメールでは、チェックが厳しいのでこのヘッダFromとエンベロープFromは一致させた方がメールの到達率が上がる。
WordPressフォームの仕様上、送信元(ヘッダFrom)には任意のメールアドレスを設定できるようになっているが、安易にGmailなどを設定してしまっている場合は見直したがよい。
Gmailでスパム判定に参照されるエンベロープFrom(Return-Path)
Gmailのスパム判定やSPFのしくみでは、エンベロープFrom(Return-Path)のアドレスを参照する。
通常、Wordpressからメールを送る際は、PHPMailer
というライブラリを用いるため、SMTPと異なり認証なしでメールを送ることができる。この際、メールの送信元(=エンベロープFrom)はWordpressサイトのサーバーとなる。
たとえば、Wordpressサイトがエックスサーバーにある場合、通常エンベロープFromはsv***.xserver.jp
となる。エンベロープFromはメールヘッダにしっかりと記載されている。
Contact Form 7プラグインで設定できる送信元アドレスは「ヘッダFrom」。この送信元(ヘッダFrom)にGmailアドレスを設定すると、エンベロープFrom(sv***.xserver.jp
)が属するドメインと異なるので「なりすまし」判定される可能性が高くなる。
Contact Form 7のエンベロープFrom(Return-Path)の設定
Contact Form 7でエンベロープFromを設定するには、追加ヘッダーの項目に入れても効かないので、function.phpに以下を追記する
add_action('phpmailer_init', function($phpmailer){
$phpmailer->SMTPKeepAlive = true;
$phpmailer->Sender = 'no-reply@example.com';
});
※no-reply@example.comの部分は実在するアドレスに適宜修正すること
function.phpの編集に抵抗がある方は、「WP Mail SMTP」プラグインを用いるとよい。「送信元アドレスを返信先 (return-path) として設定」の項目がある。
PHP mb_send_mailでのエンベロープFromの設定
ちなみにPHPのmb_send_mailでエンベロープFromを設定する場合は、第5引数の$additional_parametersを使用する。
$opt = '-fno-reply@example.com'; //-fに続けてメールアドレスを記入
mb_send_mail ( $to, $subject, $body, $headers, $opt );
なおこの方法でエンベロープFromを設定する際は、 X-Warning
ヘッダ( -fオプションを使って送信者を書き換えたという警告)が付加されないように、ApacheなどWebサーバーの実行ユーザーを信任ユーザー(trusted)に追加しておく必要がある。
SPFレコードの設定を確認
「エンベロープFrom」にWordpressサイトと同じドメイン(example.com
)を設定しているにも関わらず、Gmailに届かない、迷惑メールに振り分けられてしまう場合は、SPFレコードの設定を確認してほしい。
SPFとはSender Policy Frameworkの略で、メールの送信アドレス(正確には送信ドメイン)を偽っていないかをチェックする仕組み。具体的には次のような流れでメールのチェックが行われる。
- 受信サーバー(ここではGmail)が、Return-Pathに記載されたドメインのDNSからSPFレコードを取得
- SPFレコードに記載されたメカニズムで、送信サーバーの正当性をチェック
- 結果により、メールを受信または受信拒否する
エックスサーバーの場合は、独自ドメインを追加時に自動的に次のようなSPFレコードを設定してくれる。
v=spf1 +a:sv***.xserver.jp +a:example.com +mx include:spf.sender.xserver.jp ~all
このSPFレコードでは、次の内容が設定されている。
記載 | 意味 |
---|---|
v=spf1 | SPFのバージョン1(原則としてv=spf1の記載) |
+a:sv***.xserver.jp | sv***.xserver.jp(ホスト名)のAレコードに設定されているIPアドレスと一致する場合に正当なメールとして処理 |
+a:example.com | example.com(ドメイン)のAレコードに設定されているIPアドレスと一致する場合に正当なメールとして処理 |
+mx | MXレコードで指定されたメールサーバーと一致する場合に正当なメールとして処理 |
include:spf.sender.xserver.jp | spf.sender.xserver.jpのSPFレコードで設定されたメカニズムを含める |
~all | 末尾に記載し、他のメカニズムにマッチしなかった場合に不当なメールとして処理するが配信はされる(受信拒否される可能性がある) |
エックスサーバーの自動設定例では、ホスト名/ドメイン/MXレコード/(あとSPFインクルード)のいずれかにマッチした場合に、正当なメールとして処理されるようになっているので、example.com
をエンベロープFromとして明示的に設定しなくてもsv***.xserver.jp
のAレコードからIPアドレス一致でSPF認証パスとなる。(MXレコード/SPFインクルードでもパスするのかも)
SPFレコードが未設定の場合は、以下の詳細リンクが参考になると思う。
SPFレコードの設定でも駄目な場合、DKIMとDMARCがあるが、その話はまた別の機会に。
メールのヘッダーを分析してSFP/DKIM認証OKか確認する
「Google 管理者ツールボックス」にメールヘッダーをコピペすると、ヘッダーを分析してSPF/DKIM認証がOKか確認することができる。以下の画面では、SPFとDKIMが「pass」となっている。その他、ARC認証(転送されたメールの以前の認証ステータス)の結果が「pass」。
Gmailまたは他のメールサービスでメールのソースを表示、取得する方法については以下のリンクを参照。上記の「Google 管理者ツールボックス」の使い方も書かれているので、ぜひ試してみてほしい。
また、PostmasterToolを使うことで、迷惑メール率など送信ドメインに関するデータを確認することができる。こちらも下記Googleの記事で詳しく書かれているので参照されたし。
Googleの送信者ガイドラインは2024年2月1日以降から適用される。SPF/DKIM認証の対応は、今のうちに忘れずにチェックしておこう。