2012-08-15 13 views
5

Come codificare l'oggetto della posta in perl?Come codificare l'oggetto della posta in perl?

Ora ho finalmente trovato qualcosa, ma non è ancora funzionante:

use MIME::Words qw/encode_mimewords/; 
$recipientsubject = encode_mimewords('Votre fichier a bien été envoyé'); 

Ma la (spiati) risultato è:

Oggetto:? Votre fichier un bien = ISO-8859-1? Q = E9t = E9 = = ISO-8859-1 Q inviato = E9 =

che visualizza:??????

Votre fichier un bien étéenvoyé

(Si nutre alcuni spazi)

+1

Aggiornare la versione MIME :: Words. Questo è [bug # 5462 in MIME: Tools] (https://rt.cpan.org/Public/Bug/Display.html?id=5462), che è stato corretto in MIME :: Tools 5.504 all'inizio del 2013. – Palec

risposta

16

Uso Encode, è un modulo di base.

perl -Mutf8 -MEncode -E 'say encode("MIME-Header", "Votre fichier a bien été envoyé")' 

... uscita volontà uno di:

=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?= 
=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?= 

e decodificare con:

perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=")' 
perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=")' 

che stamperà:

Votre fichier a bien été envoyé 

Se avete ancora gli stessi risultati , dovresti dare maggiori informazioni su il tuo ambiente Perl. La versione è un buon antipasto.

+4

Pedantic note: con 'decode' a meno che non vi sia una ragione specifica per il contrario è meglio usare' MIME-Header', in quanto può gestire entrambe le codifiche MIME Q e B. [RFC 2047] (http://www.ietf.org/rfc/rfc2047.txt) afferma "un mail reader che pretende di riconoscere 'la parola codificata DEVE essere in grado di accettare la codifica per qualsiasi set di caratteri che supporta". –

+1

Grande, grazie mille! Ho usato Encode e usato encode ("MIME-q", "Votre fichier a bien été envoyé") –

+0

In realtà, Encode :: MIME :: Header è bacato e da quello che ho visto nel bugtracker, l'autore è incompetente. Chiuse ripetutamente le segnalazioni di bug corrette, anche se presentate con riferimenti validi alle RFC. In realtà, poiché Encode :: MIME :: Header è un modulo principale, molti altri moduli si basano su di esso e lo script Perl su Internet invia email non funzionanti. – Palec

2

Un altro modulo che gestisce la codifica MIME di stringhe non ASCII è Email::MIME::RFC2047. Per esempio

use strict; 
use warnings; 
use utf8; 

use Email::MIME::RFC2047::Encoder; 
use Email::MIME::RFC2047::Decoder; 

binmode(STDOUT, ':utf8'); 

my $encoder = Email::MIME::RFC2047::Encoder->new; 
my $encoded = $encoder->encode_text('Votre fichier a bien été envoyé'); 
print "$encoded\n"; 

my $decoder = Email::MIME::RFC2047::Decoder->new; 
my $decoded = $decoder->decode_text($encoded); 
print "$decoded\n"; 

stampe

Votre fichier a bien =?utf-8?Q?=c3=a9t=c3=a9_envoy=c3=a9?= 
Votre fichier a bien été envoyé 

Alcuni vantaggi di Email :: :: MIME RFC2047 oltre Encode:

  • Si sforza di utilizzare la codifica MIME per il minor numero di parole possibile, anche usando le stringhe tra virgolette nelle frasi.
  • Supporta la corretta decodifica delle frasi MIME utilizzate nelle intestazioni To, From o Cc (impossibile con Encode).
  • Supporta altri set di caratteri rispetto a UTF-8.
  • Codifica lo spazio come sottolineatura nelle parole codificate MIME-Q.
  • Ha meno errori di codifica (nessuno che io conosca).

Divulgazione: Sono l'autore del modulo.

+0

Nella descrizione del modulo si scrive su RFC 822. È il più vecchio, obsoleto da RFC 2822, che è a sua volta obsoleto da RFC 5322. Il più recente (dal 2008) non è supportato bene, AFAIK, ma RFC 2822 (da 2001) è supportato e corregge almeno il piegamento di riga, che è rotto in RFC 822. Hai un motivo per preferire 822 su 2822? – Palec

+0

@Palec Devo ammettere che sono piuttosto all'oscuro delle differenze tra le RFC. Ma penso che il mio modulo sia conforme a RFC 2822 e possibilmente anche a RFC 5322. Le classi principali per la codifica e la decodifica non piegano le linee e funzionano solo con le produzioni 'phrase' e' text'. – nwellnhof

+0

Lo esaminerò più a lungo. Devi eseguire la piegatura di una riga da qualche parte, perché le RFC impongono un forte limite per quanto tempo può essere una linea contenente una parola codificata. Se non si piega, non è possibile codificare un testo arbitrariamente lungo. – Palec