2015-04-18 21 views
7

Partire per scrivere una semplice destinatario procmail che inoltrerebbe la posta se ha trovato il testo "ABC Store: Nuovo ordine" nell'oggetto.Decodifica la posta da utf8 a ISO-8859-1 sottoposta a testo nel file .procmailrc

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

Purtroppo il campo dell'oggetto del messaggio di posta proveniente dal server di posta era in sintassi parola-codificati MIME.

Oggetto: = UTF-8 B QUJDIFN0b3JlOiBOZXcgT3JkZXI = =

Il soggetto di cui sopra è utf-8 charset ISO-8859-1, così si chiedeva se ci sono dei meccanismi/scripts/utility per analizzare???? questo e convertire in formato stringa in modo da poter applicare il mio filtro procmail.

+0

Quello che state guardando è un colpo di testa RFC2047-encoded. Come si dice nella parte charset, è in UTF-8, codificato in base64. Non c'è ISO-8859-1 qui (è una codifica diversa, non può essere in ISO-8859-1 o Latin-1 se è in UTF-8). – tripleee

+0

Nel caso generale, il repertorio di UTF-8 è molto più grande del repertorio di ISO-8859-1, quindi non sarà sempre possibile tradurre UTF-8 in ISO-8859-1. Se ti interessa solo scartare la codifica RFC2047 e recuperare il testo UTF-8, è sempre possibile (e forse una cosa migliore da fare). – tripleee

risposta

9

È possibile utilizzare perl one liner per decodificare Subject: prima dell'assegnazione alla variabile 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

Bello. Non avevo idea che 'MIME-Header' fosse una codifica disponibile – Borodin

+0

Grazie mille @Andrzej A. Filip – MON

+0

Ha funzionato !!!! sorprendente .. – MON

1

È necessario utilizzare MIME::EncWords.

Ti piace questa

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; 

uscita

ABC Store: New Order 
+0

Rimuove solo la codifica RFC2047; il risultato è ancora in UTF-8. Poiché la regex dell'OP non contiene caratteri in cui la codifica differisce tra ISO-8859-1 e UTF-8, non sembra avere importanza; ma se vuoi abbinare il testo che non è puro ASCII, la codifica conta e devi sapere quale codifica stai usando. (Come discuto in un altro commento, in realtà suggerirei di mantenere tutto in UTF-8, ma forse non è ciò che l'OP sta richiedendo, anche se la domanda non è chiara su questa parte). – tripleee

Problemi correlati