The project of U-WA-
http://uwa.potetihouse.com/
戻る
TKMP.DLL   プログラミングTips

スパムメールを判別してみる

 そもそも完全にスパムメールを判別する方法があれば、ISPがすで採用しているでしょうから、 そんな方法がないことは察し出来ると思います。 ここで紹介する方法は、メールヘッダーに含まれる配信情報を利用して 配信元のサーバーが不信な場合をチェックするものです。
 Receivedヘッダーの詳細については省略しますが、 要するにSMTP間でメールがリレーされたときの記録だと思ってください。 そこで、自身が契約しているISPのSMTPサーバーに最後に中継したメールサーバーの 情報でスパムメールを判断しようと思います。
 サンプルのメソッドはメールのReceivedヘッダー情報から以下の条件が見つかったときスパムメールとしてTureを返します。
・ホスト名に「.」が無い
・ホストの逆引きが出来ない
・逆引きしたホスト名にIPアドレスらしき数字がある
・逆引きしたホスト名が数字で始まる
これで、100%スパムメールを判別できるわけではありませんし、 また、間違ってスパムメールでないものをスパムと判断することもあるので注意してください。
 最後にISPのSMTPサーバーですが、このメソッドが必要としているSMTPサーバー名は ISPから指定されたSMTPではなく、メール受信時にISP内で処理されるSMTPサーバー名になります。 通常は、Receivedヘッダーの一番上の情報にある by句以降に書かれたサーバー名になります。 いくつかメールを見比べるとよりわかりやすいと思います。
C#.NET
//スパムメールの判定を行うクラス
//smtpserverには自身のメールボックスへ配信しているSMTPサーバー名を指定してください
private bool IsSpam(TKMP.Reader.MailReader reader , string smtpserver)
{
    //メールヘッダーから配信情報を取り出す
    string received = reader.HeaderCollection["Received"];
    //サーバー名を正規表現で使用するための変換
    string mysmtp = smtpserver.Replace("." , "\\.");

    //スパムメールの条件を設定します
    string[] rules = new string[4];
    
    //ホスト名に「.」が無い
    rules[0] = @"from [\w]* \(.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp;
    //ホストの逆引きが出来ない
    rules[1] = @"from [^\(]*\(\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp;
    //逆引きしたホスト名にIPアドレスらしき数字がある
    rules[2] = @"from [^\(]*\(.*(\d{1,3}\-){3}\d{1,3}.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp;
    //逆引きしたホスト名が数字で始まる
    rules[3] = @"from [^\(]*\(\d.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp;


    //配信情報がスパムメールの条件に一致するか確認します
    foreach(string rule in rules)
    {
        if( System.Text.RegularExpressions.Regex.IsMatch( received , rule))
        {
            return true;
        }
    
    }

    return false;

}
VB.NET
'スパムメールの判定を行うクラス
'smtpserverには自身のメールボックスへ配信しているSMTPサーバー名を指定してください
Private Function IsSpam(ByVal reader As TKMP.Reader.MailReader, ByVal smtpserver As String) As Boolean
    'メールヘッダーから配信情報を取り出す
    Dim received As String = reader.HeaderCollection("Received")
    'サーバー名を正規表現で使用するための変換
    Dim mysmtp As String = smtpserver.Replace(".", "\.")

    'スパムメールの条件を設定します
    Dim rules(4) As String

    'ホスト名に「.」が無い
    rules(0) = "from [\w]* \(.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp
    'ホストの逆引きが出来ない
    rules(1) = "from [^\(]*\(\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp
    '逆引きしたホスト名にIPアドレスらしき数字がある
    rules(2) = "from [^\(]*\(.*(\d{1,3}\-){3}\d{1,3}.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp
    '逆引きしたホスト名が数字で始まる
    rules(3) = "from [^\(]*\(\d.*\[(\d{1,3}\.){3}\d{1,3}\].*\)by " + mysmtp


    '配信情報がスパムメールの条件に一致するか確認します
    Dim rule As String
    For Each rule In rules
        If System.Text.RegularExpressions.Regex.IsMatch(received, rule) Then
            Return True
        End If
    Next rule

    Return False
End Function
VB.NETのコードはC#.NETを元に「C#.NET to VB.NET Translator」によって作成したものです

トップページへ移動
The project of U-WA-
http://uwa.potetihouse.com/