Pergunta sobre email, encoding, perl, utf-8, subject – Como codificar assunto de correio em perl?

5

Como codificar assunto de correio em perl?

Agora eu finalmente encontrei algo, mas ainda não está funcionando:

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

Mas o resultado (bugged) é:

Assunto: Votre fichier a bien =? ISO-8859-1? Q? = E9t = E9? = =? ISO-8859-1? Q? Envoy = E9? =

Qual exibe:

Votre fichier a bien étéenvoyé

(Ele come alguns espaços)

Atualize sua versão MIME :: Words. Isto éBug # 5462 no MIME: Ferramentas, que foi corrigido no MIME :: Tools 5.504 no início de 2013. Palec

Sua resposta

2   a resposta
16

UsarCodificar, é um módulo central.

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

… Irá produzir um dos seguintes:

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

E decodifique com:

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

Qual vai imprimir:

Votre fichier a bien été envoyé

Se você ainda tiver os mesmos resultados, deverá fornecer mais informações sobre o seu ambiente Perl. A versão é um bom começo.

Ótimo, muito obrigado! Eu usei Encode e usei codificação ("MIME-q", "Votre fichier e bien été envoyé") Denis BUCHER
Nota pedante: Comdecode a menos que haja uma razão específica em contrário, é melhor usarMIME-Header, como ele pode lidar com as codificações MIME Q e B.RFC 2047 afirma "um leitor de correio que alega reconhecer 'palavra codificada deve ser capaz de aceitar qualquer codificação para qualquer conjunto de caracteres que ele suporta." Ven'Tatsu
Você poderia fornecer um link para esses relatórios / exemplos e também talvez uma alternativa que funcione melhor para você? matthias krull
Na verdade, Encode :: MIME :: Header é buggy e pelo que eu vi no bugtracker, o autor é incompetente. Ele repetidamente fechou relatórios de bugs corretos, mesmo quando apresentados com referências válidas para os RFCs. Na verdade, como o Encode :: MIME :: Header é um módulo central, muitos outros módulos confiam nele e o script Perl em toda a Internet envia emails quebrados. Palec
2

Outro módulo que lida com codificação MIME de strings não-ASCII éEmail :: MIME :: RFC2047. Por exemplo

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

impressões

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

Alguns benefícios do Email :: MIME :: RFC2047 sobre Encode:

Ele se esforça muito para usar a codificação MIME para o menor número de palavras possível, também usando strings citadas em frases.Ele suporta a decodificação correta de frases MIME usadas nos cabeçalhos To, From ou Cc (impossível com Encode).Ele suporta outros conjuntos de caracteres do que UTF-8.Codifica o espaço como sublinhado em palavras codificadas em MIME-Q.Tem menos bugs do que o Encode (nenhum que eu saiba).

Divulgação: Eu sou o autor do módulo.

@Palec Eu só me certifico de que as palavras codificadas em MIME não sejam maiores do que o tamanho máximo (75 caracteres ou mais). A dobra de linha é então feita por um módulo que gerencia os cabeçalhos comoEmail::Simple. nwellnhof
Eu vou investigar mais algum dia. Você precisa executar a dobra de linha em algum lugar, porque os RFCs impõem um limite forte em quanto tempo uma linha contendo uma palavra codificada pode ser. Se você não fizer o fold, não poderá codificar um texto arbitrariamente longo. Palec
@Palec Devo admitir que sou bastante ignorante sobre as diferenças entre os RFCs. Mas eu acho que meu módulo está em conformidade com o RFC 2822 e, possivelmente, o RFC 5322 também. As classes principais para codificação e decodificação não dobram linhas e só funcionam comphrase etext produções. nwellnhof
Na descrição do módulo você escreve sobre o RFC 822. É o mais antigo, obsoleto pelo RFC 2822, que por sua vez é obsoleto pelo RFC 5322. O mais recente (de 2008) não é bem suportado, AFAIK, mas RFC 2822 (de 2001) ) é suportado e corrige pelo menos a dobra de linha, que está quebrada no RFC 822. Você tem um motivo para preferir 822 mais de 2822? Palec

Perguntas relacionadas