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

投稿者: | 2013/08/16

前回は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コマンドを使います。

Postfixの設定

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

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

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

Postfixを再起動します。

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

メール送信して確認

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

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

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の設定項目はいずれまとめたいと思います []

[Postfix]SPFレコードを設定して携帯へメールを送信できるようにする」への6件のフィードバック

  1. Qinoa

    今、作成中のサイトのさんこうになりました。
    ありがとうございます。

    ところで、下記のキーですが、多分つづりまちがえですよね?
    sender_canonical_calsses

    簡単ですが、お礼とご報告をいたします。

    返信
    1. shu1 投稿作成者

      Qinoaさん
      綴り間違えていました。正しくはご存知の通り、sender_canonical_classes です。
      記事を訂正します。大変失礼しました!

      今後も参考にしていただければ嬉しいです。

      返信
  2. るっちょ

    いやぁ、ありがたい。
    「備忘録」とありますが、意味も書いてあるので
    他の人が見ても使えます。
    だいじょぶ?と思いながらではなく、安心して使えます。

    「お名前.com」のところも助かりました。

    返信
    1. shu1 投稿作成者

      コメントありがとうございます。
      コピペだけでなく、僕がある程度納得したものを理由も添えているので
      他の方々にも分かりやすくなっていればとても嬉しいです。

      しかし、僕もたまに(しょっちゅう?)間違いを犯すので、ここで掲載した内容がすべて正しいとは限らないのでその点をご了承いただければ幸いです。
      今後もよろしければ記事の購読の程、よろしくお願い致します。

      返信
  3. るっちょ

    SPFレコードの書き方の参考サイトでは

    『 IPv4アドレスによる指定の場合、機構は「ipv4」ではなく「ip4」と指定します。』

    とありますが、お名前ドットコムの書き方を説明されている部分では、
    『foo.com TXT 60 v=spf +ip:101.102.103.104 -all』
    と「ip」となっています。
    どちらにしたらいいのでしょう???

    返信
    1. shu1 投稿作成者

      るっちょさん

      ご指摘ありがとうございます。
      確かに「ip4」ではなく、「ipv4」ですね。失礼致しました。
      記事も訂正いたします。

      今後もご指導の程、よろしくお願い致します。

      返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*