2015-04-18 10 views
7

Należy napisać prostą recepturę procmaila, która przesyła pocztę, jeśli tekst "ABC Store: New Order" zostanie znaleziony w temacie.Dekodowanie wiadomości utf8 do ISO-8859-1 z zastrzeżeniem tekstu w pliku .procmailrc.

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

Niestety, pole tematu w wiadomości e-mail przychodzącej z serwera pocztowego było w składni kodowanej za pomocą MIME-word.

Subject: = UTF-8 B QUJDIFN0b3JlOiBOZXcgT3JkZXI = =

Powyższy przedmiot jest UTF-8 charset ISO-8859-1, więc zastanawiałem się, czy są jakieś mechanizmy/skrypty/narzędzia do analizowania??? to i przekonwertuj na format ciągów, aby móc zastosować mój filtr procmail.

+0

czego szukasz w to nagłówek RFC2047 kodowane. Jak mówi w części zestawu znaków, jest w kodowaniu UTF-8, base64. Tu nie ma ISO-8859-1 (to inne kodowanie, nie może być w ISO-8859-1 aka Latin-1, jeśli jest w UTF-8). – tripleee

+0

W ogólnym przypadku, repertuar UTF-8 jest znacznie większy niż repertuar ISO-8859-1, więc nie zawsze będzie można przetłumaczyć kodowanie UTF-8 na ISO-8859-1. Jeśli zależy Ci tylko na rozpakowaniu kodowania RFC2047 i odzyskaniu tekstu w formacie UTF-8, zawsze jest to możliwe (i być może lepszym rozwiązaniem). – tripleee

Odpowiedz

9

Możesz użyć perl one liner do dekodowania Subject: przed przypisaniem do zmiennej 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

Nice. Nie miałem pojęcia, że ​​'MIME-Header' był dostępnym kodowaniem – Borodin

+0

Dziękuję bardzo @Andrzej A. Filip – MON

+0

To działało !!!! niesamowite .. – MON

1

Powinieneś użyć MIME::EncWords.

Ci się to

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; 

wyjściu

ABC Store: New Order 
+0

To tylko rozpakowuje kodowanie RFC2047; wynik jest nadal w UTF-8. Ponieważ wyrażenie regularne nie zawiera żadnych znaków, w których kodowanie różni się między ISO-8859-1 i UTF-8, nie wydaje się to istotne; ale jeśli chcesz dopasować tekst, który nie jest czystym ASCII, kodowanie ma znaczenie i powinieneś wiedzieć, jakiego kodowania używasz. (Jak twierdzę w innym komentarzu, sugerowałbym, aby zachować wszystko w UTF-8, ale być może nie jest to tym, czego żąda PO, chociaż pytanie jest niejasne w tej części). – tripleee

Powiązane problemy