SPFレコードをチェックするperlスクリプト

を書いてみた。

必要なパッケージはMail::SPFである。これをCPANでインストール
結構依存するパッケージが多いので全てyesでインストール

# perl -MCPAN -e shell
cpan> install Mail::SPF
cpan> quit
#

書いたスクリプトは以下。。。
といってもほぼソースに書いてあるサンプルまんまですが。。。(汗

checkSPF関数は、Fromアドレスのドメインと、送信して来たSMTPサーバーのIPアドレスをチェックし、正しいSMTPサーバーから送られてきている場合0、Fromを偽っている可能性がある場合Fromアドレスが属するSMTPサーバーから送られて来ていない場合は1を返します。

@以降のドメインが正しいドメインから送出されていることをチェックするだけで、存在するメールアドレスかどうかをチェックすることは出来ません。
(出来たら大問題だが。。。)

メールのreceivedヘッダに記述してあるIPアドレスをこの関数に渡し正しいSMTPサーバーから送られてきたものかをチェックしています。
#!/usr/bin/perl

use strict;
use utf8;
use Mail::SPF;

#存在するメールアドレスと正しいメールサーバーのアドレス
&test('foo@hogehoge.jp','aaa.bbb.ccc.ddd',0);
#存在しないメールアドレスと正しいメールサーバーのアドレス
&test('foo2@hogehoge.jp','aaa.bbb.ccc.ddd',0);
#存在するメールアドレスと正しくないメールサーバーのアドレス
&test('foo@hogehoge.jp','abc.abc.abc.abc',1);
#存在しないメールアドレスと正しくないメールサーバーのアドレス
&test('foo2@hogehoge.jp','abc.abc.abc.abc',1);
#記事に載せるの疲れたので略

sub test()
{
my ($from,$ip,$expectation) = @_;

my $ret = &checkSPF($from,$ip);
print "checkSPF test: from=$from,ip=$ip,result=$ret";
if ($ret == $expectation) {
print " -> OK";
} else {
print " -> NG";
}
print "\n";
}

sub checkSPF
{

my ($from,$ip) = @_;

#サーバーに問い合わせするためのオブジェクトを作成
my $spf_server = Mail::SPF::Server->new();

#リクエストメッセージの作成
my $request = Mail::SPF::Request->new(
versions => [1, 2], # SPFのv1,2でチェック
scope => 'mfrom', # identityでFromで送られてきたメールアドレスをチェックすることを宣言(他にhelo、praが指定できる)
identity => $from, #チェックするメールアドレス (scopeがheloの時はheloで告げられた文字列)
ip_address => $ip, #メールを送信して来たSMTPサーバーのIPアドレス
);

#サーバーにリクエストを送信
my $result = $spf_server->process($request);

#my $result_code = $result->code; # 'pass', 'fail', etc.
#my $local_exp = $result->local_explanation;
#my $authority_exp = $result->authority_explanation
#my $spf_header = $result->received_spf_header;

if ($result->is_code('pass')) {
return 0;
}
return 1;
}

1;

う~ん、自分が使用しているメールアドレスを全て試して期待値通りの動作をしたが、正常系のサンプルが全然足りない。。。

人の使うわけにゃいかんしなぁ。。。

ezwebとsoftbankの人でメールアドレスをテストに使って良いよ!って人、大募集!!(汗

募集しても名乗る人いないか。。。(汗

いあ、自分でテストしてその結果をWebに載せてくれてもOKだし、はるかに良いサンプル書いてくれてもOK!!

ただ参考にしたいので書いてあるURLを教えてね(汗

まぁ、仮想のアドレスでも良いのだけどねぇ。。。完全な正常系の動作をチェックしたことにはならないから。。。

Mail::SPF関係マニュアルのURLは以下
そういえばいつの間にかidentを使えるサーバーが死滅したが、あの頃はネットで悪いことを考える人もほとんどいない良い時代だった。。。

自サイトの関連ページ
ふっくんのブログっぽいサイト: SPFレコードをチェックするperlスクリプト
http://web.fpso.jp/article.php/20080712212656433