6

如何在 perl 中编码邮件主题?

现在我终于找到了一些东西,但它仍然无法正常工作:

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

但是(错误的)结果是:

主题:Votre fichier a bien =?ISO-8859-1?Q?=E9t=E9?= =?ISO-8859-1?Q?envoy=E9?=

显示:

Votre fichier a bien étéenvoyé

(它吃掉一些空间)

4

2 回答 2

17

使用Encode,它是一个核心模块。

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

... 将输出以下任一项:

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

并解码:

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

这将打印:

Votre fichier a bien été envoyé

如果您仍然有相同的结果,您应该提供有关您的 Perl 环境的更多信息。该版本是一个很好的入门。

于 2012-08-15T13:45:51.963 回答
2

另一个处理非 ASCII 字符串 MIME 编码的模块是Email::MIME::RFC2047。例如

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

印刷

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

Email::MIME::RFC2047 优于 Encode 的一些好处:

  • 它尝试对尽可能少的单词使用 MIME 编码,也通过在短语中使用带引号的字符串。
  • 它支持正确解码 To、From 或 Cc 标头中使用的 MIME 短语(使用 Encode 是不可能的)。
  • 它支持 UTF-8 以外的其他字符集。
  • 它在 MIME-Q 编码的单词中将空格编码为下划线。
  • 它的 bug 比 Encode 少(据我所知没有)。

披露:我是该模块的作者。

于 2015-06-29T23:30:38.473 回答