SMTP通信について
rules.MailRulesファイルを理解するためには、SMTP通信について理解することが重要です。メッセージはSMTP通信によって配信され、SMTP通信が行われるタイミングと順番はさまざまなルールで設定された動作内容によって決まります。下図は、単純なRFC-2822準拠のメッセージがSMTP経由でインターネットサービスに配信されるときに行われる動作を時系列でまとめたものです。SMTP通信では、次のような動作が実行されます。
あるルールファイルを例にとって、メッセージ処理の様子を見てみましょう。ここでは、rules.MailRulesファイルに次のルールを記述しているとします。
# メッセージが信頼済みIPアドレスから発信されていれば次の動作を実行
^: IF (@istrustedip($senderip)) DONE
# 管理者が設定できる変数をここで定義
^: IF (1) SET $spamMax=50
# Receivedヘッダでスパム配信者をチェック
Received:regexp:"\\[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\)" SET $IP = "\\1"
Received:IF (isspamip($IP)) NDN
# 件名をチェック
Subject:IF (@inblocklist($subject)) SET $spamlevel += 50
Subject:" " SET $spamlevel += 25
Subject:IF (@allcaps ($subject)) SET $spamlevel += 25
# errors-toがスパムである可能性が低い場合
Errors-To:"*@*" SET $spamlevel -= 20 AND $spamtests += "-ERRORS_TO;"
# 任意のヘッダにViaguraという単語がある場合はジャンクとして識別
*: "Viagra" SET $spamlevel += 25
# ヘッダの最後で処理されたスパムレベルに対応するルール
: IF ($spamlevel >= $spamMax) NDN 550 "Sorry, your message has triggered a spam block, please contact the postmaster."
このrules.MailRulesファイルがメッセージをどのように処理するのかを見てみましょう。
他のメールサーバがインターネットサービスに接続すると、DATAコマンドが送られるまでSMTPによるやり取りが続きます。メッセージの残りの部分は次のように処理されます。
・^ ルールが実行されます。
$spamMaxを50とし、送信元メールサーバが信頼済みIPであれば、すべてのルール処理を停止します。
SMTPチャネルに到達すると * ルールが実行され、「user@is.com」が「Viagra」と比較されます。一致しなければ何も起こりません。
SMTPチャネルに到達すると * ルールが実行され、「user@is.com」が「Viagra」と比較されます。一致しなければ何も起こりません。
・Subject:HELLO OUT THERE!
SMTPチャネルに到達すると、「"Subject:IF (@inblocklist($subject)) SET $spamlevel + = 50"」のルールが実行され、何も起こりません。
「Subject:" " SET $spamlevel + = 25" 」のルールが実行され、$spamlevelが25になります。
「Subject:IF (@allcaps($subject)) SET $spamlevel += 25」のルールが実行され、$spamlevelが50になります。
*ルールが実行され、「HELLO OUT THERE!」が「Viagra」と比較されます。一致しなければ何も起こりません。
・"<CRLF>"
空白行に到達すると""ルールが実行され、「:IF ($spamlevel >= &$SpamMax) NDN 550 "Sorry your message has triggered a spam block, please contact the postmaster"」のルールが実行されます。
$spamlevelが50であるため、メッセージは拒否され、不達メッセージが返されます。送信元のメールサーバはこの不達メッセージを確認して、接続を停止します。
他のメッセージが送信されると、この処理が再度行われます。
|