2015-04-18 4 views
7

Настроить простой рецепт procmail, который пересылал бы почту, если бы нашел текст «Магазин ABC: Новый заказ» в теме.Декодирование 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, он находится в кодировке UTF-8, base64. Здесь нет ISO-8859-1 (это другая кодировка, она не может быть в ISO-8859-1, а латинская-1, если она находится в UTF-8). – tripleee

+0

В общем случае репертуар UTF-8 намного больше, чем репертуар ISO-8859-1, поэтому вы не всегда сможете переводить UTF-8 на ISO-8859-1. Если вы только заботитесь о развертывании кодировки RFC2047 и восстановлении текста UTF-8, это всегда возможно (и, возможно, лучше всего делать). – tripleee

ответ

9

Вы можете использовать perl один вкладыш для декодирования Subject: перед установкой переменной procmail.

# 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