2012-08-15 8 views
5

Jak kodować temat wiadomości w Perlu?Jak kodować temat wiadomości w Perlu?

Teraz w końcu znalazłem coś, ale to nadal nie działa:

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

Ale (podsłuchu) Wynik:

Temat: Votre Fichier a bien = ISO-8859-1? Q = E9t = E9 = = ISO-8859-1 Q = wysłannik E9 =

który wyświetla??????

Votre fichier w bien étéenvoyé

(je się spacje)

+1

Zaktualizuj wersję MIME :: Words. To jest [błąd # 5462 w MIME: Narzędzia] (https://rt.cpan.org/Public/Bug/Display.html?id=5462), który został poprawiony w MIME :: Tools 5.504 na początku 2013 roku. – Palec

Odpowiedz

16

Zastosowanie Encode, to główny moduł.

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

... wyjścia albo będzie jednym z:

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

i dekodować z:

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==?=")' 

Które będzie drukować:

Votre fichier a bien été envoyé 

Jeśli nadal masz takie same wyniki , powinieneś podać więcej informacji na temat Twoje środowisko Perla. Wersja jest dobrym starterem.

+4

Pedantyczna nuta: W przypadku 'decode', chyba że istnieje ku temu powód, najlepiej jest użyć' MIME-Header', ponieważ może on obsługiwać zarówno kodowanie MIME Q jak i B. [RFC 2047] (http://www.ietf.org/rfc/rfc2047.txt) stwierdza, że ​​"czytnik poczty, który twierdzi, że rozpoznaje" zakodowany wyraz, MUSI być w stanie zaakceptować kodowanie dowolnego zestawu znaków, który obsługuje. " –

+1

Świetnie, wielkie dzięki! Użyłem Encode i użytego kodowania ("MIME-q", "Votre fichier a bien été envoyé"). –

+0

Właściwie, Encode :: MIME :: Header jest błędny iz tego co widziałem w systemie bugtracker, autor jest niekompetentny. Wielokrotnie blokował poprawne raporty o błędach, nawet jeśli przedstawiały poprawne odniesienia do specyfikacji RFC. W rzeczywistości, ponieważ Encode :: MIME :: Header jest modułem podstawowym, wiele innych modułów polega na nim, a skrypt Perl w całym Internecie wysyła zepsutą pocztę. – Palec

2

Kolejnym modułem obsługującym kodowanie MIME łańcuchów innych niż ASCII jest Email::MIME::RFC2047. Na przykład

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"; 

drukuje

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

Niektóre zalety e-mail :: MIME :: RFC2047 ponad Kodowanie:

  • próbuje trudno użyć kodowania MIME dla kilku słowach, jak to możliwe, również za pomocą cytowanych ciągów w wyrażeniach.
  • Obsługuje poprawne dekodowanie wyrażeń MIME używanych w nagłówkach To, From lub Cc (niemożliwe z Kodem).
  • Obsługuje inne zestawy znaków niż UTF-8.
  • Koduje przestrzeń jako podkreślenie w słowach zakodowanych w MIME-Q.
  • Ma mniej błędów niż kodowanie (żaden nie znam).

Ujawnienie: Jestem autorem modułu.

+0

W opisie modułu piszesz o RFC 822. Jest to najstarszy, przestarzały przez RFC 2822, który z kolei jest przestarzały przez RFC 5322. Najnowszy (od 2008) nie jest dobrze obsługiwany, AFAIK, ale RFC 2822 (od 2001) jest obsługiwany i naprawia co najmniej składanie linii, co jest zepsute w RFC 822. Czy masz powód, aby preferować 822 ponad 2822? – Palec

+0

@Palec Muszę przyznać, że nie mam pojęcia o różnicach między RFC. Ale myślę, że mój moduł jest zgodny z RFC 2822 i ewentualnie RFC 5322. Klasy podstawowe do kodowania i dekodowania nie składają linii i działają tylko z produkcjami 'fraza' i' text'. – nwellnhof

+0

Jeszcze raz się nad tym zastanowię. Trzeba gdzieś wykonywać składanie linii, ponieważ specyfikacje RFC nakładają silny limit na długość linii zawierającej zakodowane słowo. Jeśli się nie spasujesz, nie możesz kodować dowolnie długiego tekstu. – Palec