為什麼 procmail 不符合這個規則?

為什麼 procmail 不符合這個規則?

我有以下規則將所有帶有可疑附件的電子郵件發送到專用資料夾:

# Emails with attachments
:0
* ^Content-Type: multipart/
{
  :0 B
  * ^Content-Type: application/(zip|x-zip-compressed)|\
    ^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*attachment.*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*application.octet-stream.*name=.*\.(zip|exe|rar|rtf|docm)
  $L/.3_my._quarantine/
}

然而我剛剛注意到一封帶有 zip 附件的電子郵件從其中滑過,我不明白為什麼(my@email 和 myemail 包含我的電子郵件和我混淆的主機):

X-Priority: 3 (Normal)
From: [email protected]
To: "[email protected]"
 <[email protected]>
Subject: Attached File
Date:Mon, 16 May 2016 17:16:47 +0530
Message-Id: <272843899191709486.0001.scannerTxNo.0051@scannerF04EF6.myemail.com>
Mime-Version: 1.0
Content-Type: multipart/mixed;
 boundary="53594271E1EBE7BBDAF4BBA9"

--53594271E1EBE7BBDAF4BBA9
Content-Type: application/x-compressed;
 name="[email protected]_3602848_97891076672132.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="[email protected]_3602848_97891076672132.zip"

AFAICS^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)應該匹配嗎?是因為引號嗎?

答案1

您連結到的帖子確實表明已折疊標頭處理正確,但是這個配方正在檢查正文,而不是標題。

Procmail 的一個缺陷是它不能正確辨識 MIME 結構;這將是對現代郵件過濾器的重要補充;但可惜的是,Procmail 的開發早在 2000 年代初期就已經停止了(在此之前已經停止過一次,當時原始開發人員已經放棄了)。

作為一種粗略的解決方法,您可以在MIME 邊界上臨時拆分MIME 多部分訊息,並將每個部分提供給單獨的Procmail 配方,但這很快就會變得脆弱且複雜(理論上,MIME訊息可以任意深度嵌套,儘管對於大多數人來說)出於實際目的,您只需要向下遞歸一到兩個級別——超出這一級別的任何內容都可能是反彈或類似的東西,而不是您正在檢查的訊息的直接特徵)。

因為您的正規表示式只有幾個可能的(現實的!)分割點,所以您可以重構它以考慮可能的換行符:

:0
* ^Content-type: multipart/
{
  :0B
  * ^Content-Type: application/(zip|x-zip-compressed)|\
    ^Content-Type:.*(($)[   ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*attachment.*(($)[    ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
    ^Content-.*application.octet-stream.*(($)[  ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  $L/.3_my._quarantine/
}

您會注意到(($)[ ].*)*在一些地方添加了內容。這解釋了可能的換行符 ( ($)) 後面跟著一個空白字元(製表符或空格,[ ]),後面跟著任何內容,重複零次或多次。

(順便說一句,透過評分進行調試可能會稍微容易一些:

  :0 B
  * 1^1 ^Content-Type: application/(zip|x-zip-compressed)
  * 1^1 ^Content-Type:.*(($)[   ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  * 1^1 ^Content-.*attachment.*(($)[    ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  * 1^1 ^Content-.*application.octet-stream.*(($)[  ].*)*name=.*\.(zip|exe|rar|rtf|docm)
  ...

這樣,您可以在日誌中看到VERBOSE=yes這個複雜的多正規表示式配方中每個單獨正規表示式的結果。

如果您需要一個完全無懈可擊的配方,也許可以用 Python 或 Perl(或 Ruby 或…您有什麼)編寫一個簡單的腳本來標準化 MIME 結構。我記得很久以前有一個工具emil可以做類似的事情,但它從來都不是很完善,更不用說有詳細的文檔記錄了。 (事實上, IIRC 是專門為插入 pre-MIME 而設計的sendmail,幾乎不可能用於其他任何用途。)

相關內容