C#.NET
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;
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
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
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」によって作成したものです
Receivedヘッダーの詳細については省略しますが、 要するにSMTP間でメールがリレーされたときの記録だと思ってください。 そこで、自身が契約しているISPのSMTPサーバーに最後に中継したメールサーバーの 情報でスパムメールを判断しようと思います。
サンプルのメソッドはメールのReceivedヘッダー情報から以下の条件が見つかったときスパムメールとしてTureを返します。
・ホスト名に「.」が無い
・ホストの逆引きが出来ない
・逆引きしたホスト名にIPアドレスらしき数字がある
・逆引きしたホスト名が数字で始まる
これで、100%スパムメールを判別できるわけではありませんし、 また、間違ってスパムメールでないものをスパムと判断することもあるので注意してください。
最後にISPのSMTPサーバーですが、このメソッドが必要としているSMTPサーバー名は ISPから指定されたSMTPではなく、メール受信時にISP内で処理されるSMTPサーバー名になります。 通常は、Receivedヘッダーの一番上の情報にある by句以降に書かれたサーバー名になります。 いくつかメールを見比べるとよりわかりやすいと思います。