SPFを設定してGmailで迷惑メール扱いされるのを回避

2019-03-09開発環境系AWS

Amazon Linuxの中でサイトを作って、このサイトからPHPのmail()でGmail宛にメール送信すると迷惑メールフォルダに受信された。通常の受信ボックスに受信させたるため、SPFを設定してみた

スポンサーリンク

SPFとは

SPFの言葉の意味と仕組みについて

SPF

Sender Policy Frameworkの略
送信に使うメールアドレスが、どのメールサーバーから送信されるのかを記載した宣言書を予め作っておき、メールを受信したメールサーバーは、宣言書をみて宣言通りかどうかチェックする仕組み
(宣言書と異なるメールはジャンクと疑われる)

SPFレコード

SPFの宣言書のこと

メールアドレスを作ったとこのDNSサーバーに、TXTレコードとして登録する
例)”v=spf1 a:example.com -all”

SPF(チェック)の流れ

  1. 受信元メールサーバーは、メールアドレスを作ったとこのDNSサーバーが持っている宣言書(SPFレコード)を確認させてもらう
  2. 受信元メールサーバーは、実際に来たメールの送信元(今回はAWS。IPアドレスとかドメインとか。)が、宣言書にあるか確かめる
  3. 受信元メールサーバーは、2.の結果を元にメールを受信するか、迷惑メールフォルダに入れるとか、受け取り拒否するとか何らかの処理を行う
    (送信側で「何らかの処理」を指定したい場合には、DMARCの設定が別途必要)

SPFのチェック結果はメールヘッダにも記載され(Gmailだと「メッセージのソースを表示」で確認可)、結果を確認することができる

認証結果

結果には以下の種類がある
Pass以外は、受信先でどのように扱われるか分からない
   
Pass チェックにパスした
None SPFレコードがない
neutral SPFレコードはあるが、条件”?”に該当した(チェック結果が出せない)
SoftFail SPFレコードはあるが、条件”~”に該当した(怪しいけど失敗という確定はできない)
Fail チェックにパスしなかった
TempError 一時的な障害によりチェックできなかった
PermError SPFレコードの記述誤りなどでチェックできなかった

SPFを設定する

環境

この時の環境
サイトのサーバー:AWS EC2 Amazon Linux
メールアドレス取得先:Rackspace
サイトのドメイン取得先:Liquid Web

Amazon Linuxには、sendmailをインストールした
サイトのドメイン名と、メールアドレスのドメイン名(@以降の文字列)は異なるものを使用
サイトのドメイン名は、AWSのRoute53にAレコードが設定されている

現象

SPFを設定しない場合、Gmail(受信元メールサーバー)は、送信元メールアドレスのドメイン情報を管理している(Rackspace)DNSサーバーにあるSPFレコードを参照するが、初期状態ではSPFレコードがないので確認できない。

Gmail内で受信したメールのメールヘッダを確認すると、
SPF:NEUTRAL(IP: ××.×××.××.××)
となっていた

ゴール

SPF:PSSS(IP: ××.×××.××.××)にする

やったこと

メールアドレス取得先(Rackspace)で、SPFレコードをセットする

Rackspaceは、自分でDNSサーバーにレコードを追加・修正することができた
(レンタルサーバーなど、自分でレコードを追加・修正できない場合があるので、その場合にはサーバー管理者に問い合わせる必要がある)

  1. Rackspaceにログイン
  2. 上部ナビバーの「Select a Product」から「Rackspace Cloud」を選択
  3. 「Networking」から「Cloud DNS」を選択
  4. 対象ドメインのページに行き、Recordsセクションの「Add Record」をクリック
    Rackspace set a spf record
    Rackspace set a spf record
  5. 必要項目を記入
    Record type:TXT Record
    Host Name:何も入力しない
    Text:v=spf1 ip4:××.×××.××.×× ~all
    *1 ××.×××.××.××には、サイトのIPアドレスを記入。今回はAWSなので、このサイトのElastic IPを指定
    *2 ~allにすると、サイト以外からこのメアドで送信したメールは「 SoftFail」となる。メアドが、サイトからの送信メールにしか使用しない場合は-allにしておく(-allにすると、「Fail」と判定される)
    Time to Live (TTL):そのまま
  6. 「Add Record」をクリック

これでGmail(受信元メールサーバー)は、メールアドレス(Rackspace)のDNSサーバーにあるSPFレコードからサイトのIPアドレスを参照することができ、実際のメール送信元(サイト)と同じなのでPASSという結果を出す

実際にGmailにメール送信すると、
PASS(IP: ××.×××.××.××)
となった



以上

Posted by Agopeanuts