Grails: サービスによるビジネスロジックの分離 | Home | 「小悪魔女子大生のサーバエンジニア日記」
2011/01/24 23:28 | 印刷

迷惑メール対策として何年か前からOP25B(Outbound Port 25 Blocking)というポート番号を変える対策がありますが、最近ではさらなる対策として、SPF (Sender Policy Framework)が普及してきていて、メールサービスを提供する大手は結構採用されているようです。

SPFとは(Wikipedia)
迷惑メール対策の基礎知識(インターネット協会)

簡単に言うと、送信元メールアドレスのドメインが、送信しようとしているサーバーを許可しているかをチェックするという仕組みです。
送信を許可をする設定にはいくつか種類がありますが、最終的にはIPアドレスでマッチさせます。

この仕組みが今のところ普及しそうなので、独自ドメインでのメールシステムを扱う管理者もそろそろ対応しなくてはいけないようですね。
設定方法はここが詳しいです。
http://webos-goodies.jp/archives/51103006.html

しかしこのSPFは、メールをそのままの形で転送している場合には問題が出てきます。メールをそのまま転送した場合、FROMはその送信者であり不特定多数です。これらすべてのドメインにこちらが提供するサーバーのIPアドレスを指定してもらうことはできません。

例えば、mydomain.comというドメインで運用しているサーバーがあり、そのメール「info@mydomain.com」のメールを普段使っているYahoo!メールに転送したいとします。

この環境下で誰か(someone@docomo.ne.jp)が「info@mydomain.com」にメールを送ると、そのメールはYahoo!に転送されますが無条件に迷惑メールになってしまう、というものです。
docomo.ne.jpのDNSにはSMTPサーバーであるmydomain.comで送信することを許可していないからです。それをYahoo!のメールサーバーがチェックしているのです。

SPF対応のSMTPサーバーでは、チェックしてReceived-SPFというヘッダを付けます。正常に認証されると、
 Received-SPF: pass => 送信ドメインの正当性が認証された。
というヘッダが付きます。

しかし上記の転送メールだと、
 Received-SPF: softfail => 送信ドメインは詐称されている可能性がある。
となって迷惑メールとして扱われてしまいます。
Yahoo!メールの挙動はよくわかりませんが、時々ゴミ箱に入ってしまうとか(汗
Gmailでも何もしないと迷惑メールになりました。

<対策方法1>
現状で最も簡単な方法は、迷惑メールの例外を扱う他のメカニズムと組み合わせる事です。
一番にやることは、迷惑メールから特定のメールを「迷惑メールでない」「迷惑メールを解除」というボタンで救い出す。
それでもだめなら、連絡帳(アドレスブック)にそのメールを登録する事で例外となります。(Gmail、Yahoo!で確認済みです)
さらにフィルターを使って迷惑メールから救い出すこともできます。
ただしこの方法では最初のメールがやはり迷惑メールに入ってしまうので見落としをする可能性があるのが一番の問題です。

<対策方法2>
もう一つの方法は、メールサーバーに手を加えてFromヘッダを書き換えて転送するようにすることですが、でもFromの偽装は反則ですよね。それに例えこれで受信してもそのまま返信すれば宛先が違っていることになります。
Gmailの機能にある「メール転送」はどうしているか試してみると、GmailではFromを独自ドメインにした送信でもうまくいくんですね。
実はこれはヘッダに、
 Sender: xxxxxxxx@gmail.com
 Return-Path: xxxxxxxx@gmail.com
がついているからだと思います。SPFはこれを評価しているようです。
なのでこれと同様のことをやれば良い、ということになります。
やり方はMTAによって異なると思います。プログラムでやる方法もあるかも知れません。どちらもたぶん面倒です。

結局、今は対策方法1を地道にやってもらうしかなさそうです。

また転送していなくても、独自ドメインでのメールを外出先や自宅からプロバイダのSMTPで送信する場合も同様の問題が出る可能性があります。
でもこちらの場合は、プロバイダが特定できるのでそのSMTPサーバーのIPアドレスがわかればDNSのTXTに設定することで対応できます。

楽な方法は各プロバイダが用意してる設定を読み込んでしまうこと。
例えばOCNなら、
 v=spf1 include:spf.ocn.ne.jp ~all
としておけばOKだと思います。

Google Appsなら、
 v=spf1 include:_spf.google.com ~all

以上、次から次と問題が起こるサーバー管理者の悩める話でした。

ちなみにDNSレコード設定方法は(Google Appsの例)
VALUEDOMAIN:
 txt @ v=spf1 include:_spf.google.com ~all
BIND:
 @ TXT "v=spf1 include:_spf.google.com ~all"
って感じです。

コメント追加

タイトル
名前
E-mail
Webサイト
本文
情報保存 する  しない
  • 情報保存をすると次回からお名前等を入力する手間が省けます。
  • E-mailは公開されません - このエントリーの新規コメント通知が必要なら記入します。