2015-04-18 61 views
7

開始編寫一個簡單的procmail recipie,如果它在主題中找到文本「ABC Store:New Order」,它將轉發郵件。將utf8解碼爲ISO-8859-1郵件受制於.procmailrc文件中的文本

:0 
    * ^(To|From).*[email protected] 
    * ^Subject:.*ABC Store: New Order* 
    { 

不幸的是,來自郵件服務器的郵件消息中的主題字段是MIME編碼字的語法。

主題:= UTF-8乙QUJDIFN0b3JlOiBOZXcgT3JkZXI = =

上述受試者是UTF-8 ISO-8859-1的字符集,因此,如果有任何機制/腳本/實用程序來解析想知道????這並轉換爲字符串格式,以便我可以應用我的procmail過濾器。

+0

你正在看什麼是RFC2047編碼頭。就像它在charset部分中所說的那樣,它是以64位編碼的UTF-8編碼的。這裏沒有ISO-8859-1(這是一種不同的編碼;如果是UTF-8,它不能在ISO-8859-1中稱爲Latin-1)。 – tripleee

+0

在一般情況下,UTF-8的庫目錄比ISO-8859-1的庫目錄大得多,因此您不一定能夠將UTF-8轉換爲ISO-8859-1。如果你只關心解開RFC2047編碼和恢復UTF-8文本,那總是可能的(也許是更好的做法)。 – tripleee

回答

9

您可以在分配procmail變量之前使用perl one liner解碼Subject:

# Store "may be encoded" Subject: into $SUBJECT after conversion to ISO-8859-1 
:0 h 
* ^Subject:.*=\? 
SUBJECT=| formail -cXSubject: | perl -MEncode=from_to -pe 'from_to $_, "MIME-Header", "iso-8859-1"' 

# Store all remaining cases of Subject: into $SUBJECT 
:0 hE 
SUBJECT=| formail -cXSubject: 

# trigger recipe based also on $SUBJECT content 
:0 
* ^(To|From).*[email protected] 
* SUBJECT ?? ^Subject:.*ABC Store: New Order 
{ 
.... 
} 
+1

不錯。我不知道'MIME-Header'是一個可用的編碼 – Borodin

+0

非常感謝@Andrzej A. Filip – MON

+0

它的工作!令人驚歎的。 – MON

1

您應該使用MIME::EncWords

像這樣

use strict; 
use warnings; 
use 5.010; 

use MIME::EncWords 'decode_mimewords'; 

my $subject = '=?UTF-8?B?QUJDIFN0b3JlOiBOZXcgT3JkZXI=?='; 
my $decoded = decode_mimewords($subject); 
say $decoded; 

輸出

ABC Store: New Order 
+0

這隻解開RFC2047編碼;結果仍然是UTF-8。由於OP的正則表達式不包含ISO-8859-1和UTF-8之間的編碼不同的任何字符,所以它似乎並不重要。但是如果你想匹配不是純ASCII的文本,編碼就很重要,你應該知道你正在使用哪種編碼。 (就像我在另一個評論中所說的那樣,我實際上會建議將所有內容都保存在UTF-8中,但這可能不是OP請求的內容,儘管這個問題尚不清楚。) – tripleee