WordPressのメジャーな問合せフォームの一つにContact Form 7がありますが、これがGmailで迷惑メールに振り分けられてしまうことが少なくないようです。ここでは、その原因と対策を紹介します。
原因はSPFの失敗
Contact Form 7からGmail宛に送られてきたメールのヘッダ情報(分析結果)を見るとこうなっています。

ここで気になるのが、SPFがNONEと判定されていること。これが迷惑メール扱いされてしまう要因の一つだと思われます。
SPFレコードがない(ConoHa WING)
ヘッダを詳しく見てみます(ややこしいので、面倒なら先に飛ばしてください)。
Received-SPF: none (google.com: www97.conoha.ne.jp does not designate permitted sender hosts) client-ip=118.27.95.139; Authentication-Results: mx.google.com; spf=none (google.com: www97.conoha.ne.jp does not designate permitted sender hosts) smtp.mailfrom=c3823607@www97.conoha.ne.jp
これは、ConoHa WING(レンタルサーバ)に設置したWordPress上でContact Form 7を使った場合のものです。www97.conoha.ne.jpがGoogle(Gmail)にメールを送ろうとしているのですが、Google(Gmail)がSPFの判定をしたところSPFがnoneであったとの記録です。成功ならPASS、失敗ならFAILですが、NONEはどちらでもない状態。例えば、DNSをチェックしたのだけど、返答がなく判断できなかったという状態です。
では、DNSをチェックしてみます。サーバにSSHでつないでコンソールでdigコマンドを使います。
$ dig -t txt www97.conoha.ne.jp | grep -i spf $
たしかに、このホストに関するSPFレコードはないようで、これではSPFの判定ができません(だからNONE)。ちなみに、エックスサーバーに設置したContact Form 7ではもSPFはPASSします。SPFレコードを引くとちゃんとあります。
$ dig -t txt sv10886.xserver.jp | grep -i spf sv10886.xserver.jp. 3600 IN TXT "v=spf1 +a:sv10886.xserver.jp include:spf.sender.xserver.jp ~all" $
SPFとは?
ここで改めてSFPについてですが、これは迷惑メールを防ぐための仕組みの一つで、送信元が正しいかを判断するものです。そのために、上に書いたようにDNSを使って、そこ(SPFレコード)に記載されているか否かを調べます。
SPFレコードに記載されていればPASS、されていなければFAIL。SPFレコードがなければ判定自体ができないのでNONEとなります。非常に大雑把ですが、概ねこんな感じ。
Envelope From
SPFで送信元を調べますが、この「送信元」はメールに記載された「From」ではありません。これは好きなように設定できますので、身元確認には使えません。
では何を使うかといえは、Envelope Fromです。メールを実際に送信する前にサーバ間でやり取りする情報の一つです。Envelope(エンベロープ)は「封筒」ですね。メールを包んでいるイメージでしょうか?そのEnvelope Fromを元にDNSからSPFレコードを引いて調べるわけです。
詳しくは例えばこちらをご覧ください。
対策はEnvelope Fromの設定
原因がEnvelope Fromがないことだとわかりましたので、対策は明らかです。Envelope Fromを設定すればです。
functions.phpに仕込む方法
具体的な方法はこちらにありました。
この記事ではReturn-Pathを設定するのが目的でEnvelope Fromを設定するとあります。いずれにしても、Envelope Fromを設定できれば良いので同じことです。これで、Envelope FromもReturn-Pathも設定されます。また、この記事では問題が起きたのはエックスサーバーとのことですが、私が利用しているエックスサーバーでは問題ありませんでした(上に書いた通り)。エックスサーバーでも収容サーバによるのかもしれません。
プラグインを使う方法
上の方法ではfunctions.phpにメールアドレスを埋め込んでいます。シンプルではありますが、やや強引。プラグインでも同様なことができるものがあるようです。
前者は単にEnvelope Fromを設定する以外にも多種多様な機能があるようです。オーバスペックな気がして試していません。
後者は基本的にはEnvelope Fromを設定するだけのもの。実際に動かしてみたところ、期待どおりの動作をしてくれました。しかし、これでもいろんなケースに対応できるようにされているので、ちょっと複雑です。
自作プラグインでEnvelope Fromを設定
今回やるべきことは非常にシンプルですので、勉強がてら、プラグインを自作してみました。プラグインの名称は、ずばり、Envelope Fromとしました。
本来やるべきことは上で紹介したfunctions.phpに書き込む内容ですのでわずか数行です。しかし、プラグインとして成立させるためには設定のための画面が必要です。そちらの方が遥かに大変で、全部で約100行程になってしまいました。とは言え、わずか100行ですから、プラグインとしてはとても小さなものです。
コンセプトはシンプル。同様の目的のものはすでにありますから、それらとの差別化の意味も込めてとにかくシンプルに。と同時に、動作確認が簡単に行えるように、テスト機能も盛り込みました。
使い方を簡単にまとめるとこうです。
- インストール
- 有効化
- Envelope Fromに使うメールアドレスを設定
これだけです。Envelope Fromに使うメールアドレスには、通常は、そのサイトと同じドメインでかつ実在するアドレスを指定します。また、動作確認を簡単に行うために、テストメールの送信機能も持っています。
以下、詳しい説明です。
インストール
プラグインはこちらに用意しました。
ダウンロードしたら、プラグインの新規登録画面でZIPファイルのままドラグ&ドロップします。

「今すぐインストール」をクリック。

「プラグインを有効化」をクリック。これでインストールは完了です。
設定と動作確認
続いて設定を行います。設定画面は、プラグインの一覧かサイドバーの設定の中から開けます。


現状確認
設定の前に、現状を確認しておきます。

「Envelope From」の欄は空白のままにし、「テスト送信メールアドレス」に自分のメールアドレスを記入します。ここにテストメールを送信します。

「設定&テスト送信」をクリックすると指定したアドレス宛にテストメールが送信されます。
届いたメールのヘッダを確認します(迷惑メール扱いになっていることもありますので、そちらのフォルダもチェックしてください)。Gmailの場合は次のように分析結果が表示されます。

SPFが「NONE」になっています。実際のヘッダは次のようになっています(必要部分だけ抽出。一部伏せ字)。
Return-Path: <XXX@www97.conoha.ne.jp> Received-SPF: none (google.com: www97.conoha.ne.jp does not designate permitted sender hosts) client-ip=118.27.95.164; Authentication-Results: mx.google.com; spf=none (google.com: www97.conoha.ne.jp does not designate permitted sender hosts) smtp.mailfrom=XXX@www97.conoha.ne.jp
SPFがNONEと判定され、また、Return-Pathもサーバ会社のドメインになっています。
このとき、SPFの判定結果がPASSであれば、何もする必要はありません。このプラグイン自体が不要ですので、削除して結構です。
Envelope Fromのメールアドレスを指定
Envelope Fromに使うメールアドレスを「Envelope From」の欄に入力します。通常はそのWordPressで使用しているドメインと同じドメインのメールアドレスを使います。例えば、WordPressのURLが「http://www.example.com/」ならば、「admin@example.com」です。この例ではメールアカウントは「admin」としてありますが、ここには実在するものを使用します(メールアドレスが正しいものであるか否かの判定は行いません。記入の際は間違えないように注意してください)。

これで「設定」を押せばそれが登録されます。または、「設定&テスト送信」を押せば登録して、さらにテストメールの送信も行います。

今度はSPFがPASSと判定されています。生ヘッダも確認してみます。
Return-Path: <XXX@XXX.XXX> Received-SPF: pass (google.com: domain of XXX@XXX.XXX designates 118.27.95.164 as permitted sender) client-ip=118.27.95.164; Authentication-Results: mx.google.com; spf=pass (google.com: domain of XXX@XXX.XXX designates 118.27.95.164 as permitted sender) smtp.mailfrom=XXX@XXX.XXX
伏せ字が多く、見づらくて申し訳ありませんが、ここにはEnvelope Fromでしていたメールアドレス(自前のドメイン)が入っています。Return-Pathもこのアドレスになっています。
なお、もし、Envelope Fromの指定を削除するなら、空欄にして「設定」すればOKです。
補足
このプラグインはContact From 7から送られてきたメールがきっかけで作りましたが、動作はContact Form 7とは無関係です。WordPress内から送信するメールに広く適用されます。また、サーバも無関係です。(おそらく)どこのサーバでも使えると思います。