本日も乙

ただの自己満足な備忘録。

SPFレコードを設定して携帯へメールを送信できるようにする

前回はPostfixをインストールしてメール送信できるようにしたが、そのまま送ると差出人がユーザ名@ホスト名 (前回の例では、hoge@localhost.localdomain)となってしまいます。 自分だけに送るのであれば、これでも良いのですが、他の人に送る場合、PCメールは迷惑メールフォルダに入ってしまいます *1。 迷惑メールフォルダに入るだけなら、 送信者に迷惑メールフォルダも確認するように注意を促せばいい *2 のですが、携帯のメールアドレスに送る場合はなりすまし規制が厳しいので弾かれてしまい、メールが届かない場合があります。しかも、弾くのは携帯キャリア側なので、送る側のメールログを見ても正常に送信できていることがあるので事象を把握するのが難しいです。 そのまますんなり受信してくれればありがたいのですが、近年増加するスパムメールやなりすましメールのせいでメール事業者や携帯キャリアも対策を取らざるを得ないのです。まったく迷惑な話です。

では、どう対策するかというと、SPF(Sender Policy Framework)を利用します。 これは、メールの送信元アドレスの偽装を防ぐ技術で、つまり「あるドメインから送られてきたメールがちゃんとしたところから送られてきたかを判断する技術」です。このSPFを利用することで、正しい(差出人を偽装していない)メールを送ることができ、なりすまし規制などにも対策することができます。

実際にSPFを利用したメール送信ができるようにしていきます。

ドメインを取得する

SPFを利用するには、DNSのSPFレコードというものを設定する必要があるので、ドメインを取得します。 ドメインの取得はレジストラと呼ばれるドメインを管理している機関(会社)に申し込む必要があります。 下記のレジストラが有名だと思います。

ドメインの取得はお金がかかりますが、このブログのように汎用ドメイン(.info)だと年間300円もかからないので良い勉強だと思って取得してみましょう。 ここでは、例として、foo.com を取得したとします *3

DNSのレコードを設定する

ドメインが取得できたら、DNSのレコード設定を行います。BINDなど自分でDNSサーバーを立てている人はそれを使ってください。 DNSサーバーば無い人は、他社のDNSサーバーを使いましょう。

最近有名で使いやすいのがAWSのRoute53がありますが、ここではお名前.comでDNSレコードを設定してみます。 お名前.com でドメインを取得すると、ドメインNaviという管理画面にログインできるのでそれにログインします。

ドメイン設定→ネームサーバーの設定→DNS関連機能の設定→DNSレコード設定を利用するまで進みます。

dns_1

下記の図のようにDNSレコードを設定します。 例ではサーバーのIPアドレスを101.102.103.104としています。

dns_2

ホスト名 レコード TTL VALUE
foo.com A 60 101.102.103.104
mail.foo.com A 60 101.102.103.104
foo.com MX 60 10 mail.foo.com
foo.com TXT 60 v=spf1 +ip4:101.102.103.104 -all

[2014/05/09追記] TXTレコードの記述部分で「ip」になっていたので「ip4」に修正しました。 るっちょさん、ありがとうございます! [追記終わり]

Aレコード(ドメインとIPアドレスの紐付け)では、foo.com と101.102.103.104を紐付けています。また、メールサーバー用のドメイン(mail.foo.com)もAレコードで設定しています。 MXレコード(メールサーバー用レコード)は、優先度を10にして、mail.foo.comと紐付けています。 最後に、SPFレコードとしてTXTレコードを設定します。 *4 SPFレコードの内容はここでは詳細に説明しませんが、簡単に言うと「foo.comから送られてきたメールは 101.102.103.104 から以外は拒否していいよ」という意味です。

この設定でDNSレコードを設定してください。TTLが60なので比較的早めに反映されるかと思います。 DNSレコードが反映されたか確認するには、digコマンドやnslookupコマンドを使います。

$ dig foo.com txt

;; ANSWER SECTION:
foo.com.           58      IN      TXT     "v=spf1 +ip4:101.102.103.104 -all"

$ nslookup -type=TXT foo.com
Server:         192.168.50.1
Address:        192.168.50.1#53

Non-authoritative answer:
foo.com    text = "v=spf1 +ip4:101.102.103.104 -all"

Postfixの設定

Postfixの設定を行います。 まず、メインのmain.cfの設定を行います。 *5

[2014/04/10追記] sender_canonical_classes がtypoしていたので修正しました。 Qinoaさん、ありがとうございます! [追記終わり]

$ sudo vim /etc/postfix/main.cf

# 以下を設定
# すでにある項目はコメントアウトするか消してください
myhostname = mail.foo.com
mydomain = foo.com
myorigin = $myhostname
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
sender_canonical_classes = envelope_sender
sender_canonical_maps = hash:/etc/postfix/sender_canonical

次に、送信者情報のファイルを作成します。 Fromのメールアドレスが xxxx@mail.foo.com の場合は、xxxx@foo.com に変更するようにします。

# 新規作成
$ sudo vim /etc/postfix/sender_canonical

@mail.foo.com @foo.com

$ sudo postmap /etc/postfix/sender_canonical

Postfixを再起動します。

$ sudo service postfix restart

これで設定が完了したのでメール送信して確認します。

メール送信して確認

Gmailだとメールのヘッダも含めて確認できるのでGmailに送ってみます。

$ sendmail foo@gmail.com

test
.

正しく設定できていれば以下のようになると思います。

Delivered-To: foo@foo.com
Received: by 10.220.191.196 with SMTP id dn4csp14451vcb;
        Wed, 14 Aug 2013 01:55:38 -0700 (PDT)
X-Received: by 10.67.2.74 with SMTP id bm10mr8715963pad.109.1376470537455;
        Wed, 14 Aug 2013 01:55:37 -0700 (PDT)
Return-Path: 
Received: from mail.foo.com (xxxxxxxxx.sakura.ne.jp. [101.102.103.104])
        by mx.google.com with ESMTP id zr1si27464653pbc.330.2013.08.14.01.55.36
        for ;
        Wed, 14 Aug 2013 01:55:37 -0700 (PDT)
Received-SPF: pass (google.com: domain of foo@foo.com designates 101.102.103.104 as permitted sender) client-ip=101.102.103.104;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of foo@foo.com designates 101.102.103.104 as permitted sender) smtp.mail=foo@foo.com
Received: by mail.foo.com (Postfix, from userid 500)
id 2BB7D3000FB; Wed, 14 Aug 2013 17:55:36 +0900 (JST)
Message-Id: <20130814085536.2BB7D3000FB@mail.foo.com>
Date: Wed, 14 Aug 2013 17:55:33 +0900 (JST)
From: foo@foo.com
To: undisclosed-recipients:;

test

Received-SPFが pass になっていればOKです。softfail などになっている場合、設定を見直してください。

SPFの認証結果 http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/#60

あとは、auなどの携帯メールアドレスにも送信して着信できるか試してください。

最後に

SPFレコードを設定して"正しく"メール送信ができるように設定しました。 自分でWEBサービスを作る場合、メール送信で携帯アドレスに届かない場合があったらSPFレコードを設定してください。

参考URL

SPFについての基礎的知識ならこちらが参考になります。 Sender Policy Framework (Wikipedia) SPF(Sender Policy Framework)

SPFレコードの書き方はこちらが参考になります。 間違いから学ぶSPFレコードの正しい書き方

携帯キャリアの設定方法

auが一番厳しい設定になっているので、auが届けば他の携帯キャリアのメールアドレスにも届くかと思います。 DoCoMo 送信ドメイン認証(Sender ID/SPF)について au 送信ドメイン認証SPFレコードについて SoftBank NTTドコモ「なりすましメール対策」提供、ソフトバンクモバイル「なりすましメール拒否設定」機能拡充にともなうソフトバンクテレコム各種メールサービスの対応についてのご案内

*1:最近のメールは賢いのでメールヘッダだけで迷惑メールかどうかを自動的に判別してくれます

*2:それでも不便なのは確かですのでそうならないようにしたいものです

*3:実際にfoo.comにアクセスするとスパムサイトっぽいので訪問しないようにしてください

*4:AWS Route53ではSPFレコードも設定できますが、古いDNSサーバーではTXTレコードしか対応していないそうなので、TXTレコード設定すると良いです

*5:Postfixの設定項目はいずれまとめたいと思います