邮件主题MIME编码在Perl中。

时间:2014-04-10 13:16:38

标签: perl email encoding utf-8 mime

我正在尝试在Perl 5.8.5下的主题行中发送包含非ASCII字符的电子邮件。我的简单示例使用“Änderungen”(德语变音符号)这个词,但不是正确地转换“Ä”,主题行总是变成“Ã?nderungen”。

#!/usr/bin/env perl

use warnings;
use strict;
use Encode qw(decode encode);

my $subject = "Änderungen";
my $subject_encoded = encode("MIME-Q", $subject);

[...]

open(MAIL, "| /usr/sbin/sendmail -n -t $recipient") || return "ERROR";
print MAIL 'Content-Type: text/plain; charset="utf-8"\n';
print MAIL "To: $recipient\n";
print MAIL "From: $from\n";
print MAIL "Reply-To: $from\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$body\n\n";
print MAIL ".\n";
close(MAIL);

$ subject_encoded的内容打印为=?UTF-8?Q?=C3=83=C2=84nderungen?=,而在线encoder tool则显示其实际应为=?UTF-8?Q?=C3=84nderungen?=

当使用后一种编码手动构建主题字符串时,邮件主题将在我的电子邮件软件中正确显示“Änderungen”,因此问题似乎与实际的Perl编码命令有关。我正在尝试使用quoted-printable编码,但是通过MIME-B和MIME-Header编码也会导致“Ã?nderungen”的错误表示。

我确实检查了我的代码文件的文件格式,并且charset也以utf-8的形式返回。因此,我不知道为什么Perl显然是以错误的方式编码。我可能忽略了任何想法或事物?

2 个答案:

答案 0 :(得分:4)

您的编辑器将文件视为UTF-8,因此显示

my $subject = "Änderungen";

Perl有效地将文件视为iso-8859-1,因此它看到了

my $subject = "Ã?nderungen";

告诉Perl您通过添加

使用UTF-8对脚本进行编码
use utf8;

答案 1 :(得分:0)

在你的问题中,你宣布:

my $subject_encoded = encode("MIME-Q", $subject);

但你以后没有使用它。

print MAIL "Subject: $subject\n\n";

应该是:

print MAIL "Subject: $subject_encoded\n\n";