Base64 电子邮件主题未正确解码

And*_*wby 1 email perl base64 email-headers

我想知道为什么我的base64电子邮件主题没有解码。我使用这个Perl代码来创建它:

use MIME::Base64;
use Encode;
$subject = "=?UTF-8?B?" . encode_base64(encode("utf8", $subject), "") . "?=";
Run Code Online (Sandbox Code Playgroud)

这给了我:

=?UTF-8?B?w63DsyBEZW1hbmRlIGRlIHJlc2VydmF0aW9uIGR1IHd3dy5jaGFtYnJlc2Rob3Rlcy5vcmcgLSBSZXNlcnZhdGlvbiByZXF1ZXN0IGZyb20gd3d3LmNoYW1icmVzZGhvdGVzLm9yZyBbI10=?=
Run Code Online (Sandbox Code Playgroud)

如果我复制并粘贴:

w63DsyBEZW1hbmRlIGRlIHJlc2VydmF0aW9uIGR1IHd3dy5jaGFtYnJlc2Rob3Rlcy5vcmcgLSBSZXNlcnZhdGlvbiByZXF1ZXN0IGZyb20gd3d3LmNoYW1icmVzZGhvdGVzLm9yZyBbI10=
Run Code Online (Sandbox Code Playgroud)

...进入此站点进行解码:

http://www.webatic.com/run/convert/base64.php

..然后结果很好!

完整的电子邮件标题如下所示:

Subject: =?UTF-8?B?w63DsyBEZW1hbmRlIGRlIHJlc2VydmF0aW9uIGR1IHd3dy5jaGFtYnJlc2Rob3Rlcy5vcmcgLSBSZXNlcnZhdGlvbiByZXF1ZXN0IGZyb20gd3d3LmNoYW1icmVzZGhvdGVzLm9yZyBbI10=?=
Run Code Online (Sandbox Code Playgroud)

这是它在我的电子邮件客户端中的显示方式:

在此处输入图片说明

...这就是我通过在线工具转换它时的看法:

在此处输入图片说明

更新:这实际上是Email::MIME创建电子邮件的方式:

From: "Andy chambresdhotes.org" <test@foo.org>
To: andynewby@bar.com
Subject: =?UTF-8?B?PT9VVEYtOD9CP3c2M0RzeUJFWlcxaGJtUmxJR1JsSUhKbGMyVnlk?=
 =?UTF-8?B?bUYwYVc5dUlHUjFJSGQzZHk1amFHRnRZbkpsYzJSb2IzUmxjeTV2Y21jZ0xT?=
 =?UTF-8?B?QlNaWE5sY25aaGRHbHZiaUJ5WlhGMVpYTjBJR1p5YjIwZ2QzZDNMbU5vWVcx?=
 =?UTF-8?B?aWNtVnpaR2h2ZEdWekxtOXlaeUJiSTEwPT89?=
Date: Thu, 11 Jan 2018 14:46:05 +0000
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="15156819650.22DF651.1990"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Run Code Online (Sandbox Code Playgroud)

我用来制作标题的完整 Perl 代码是:

    my $email = Email::MIME->create(
      header_str => [
          From => $from,
          To => [ $to ],
          Subject => $subject,
      ],
      parts => \@parts,
      attributes => {
            encoding => 'base64', # this was the trick
            charset  => "UTF-8",
            content_type => "multipart/alternative",
            disposition  => "inline",
        }
  );
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 5

你正在使用Email::MIMEwithheader_str然后你尝试给出编码的主题,即这样的东西:

my $mail = Email::MIME->create(
    header_str => [
        Subject => '=?UTF-8?B?w4PChHJnZXJsaWNoZSBHcsODwrzDg8KfZQ==?='
    ]
);
Run Code Online (Sandbox Code Playgroud)

正如所记录的那样, header_str需要未编码的(即 unicode)字符串并将对字符串本身进行编码。这会导致您看到的双重编码。从文档中引用:

header_str参数是要包含在消息中的头对列表。每对的值应该是一个文本字符串,将根据需要进行 MIME 编码

正确使用将提供如下未编码的字符串:

my $mail = Email::MIME->create(
    header_str => [
        Subject => 'Ärgerliche Grüße'
    ]
);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用header以下方法提供编码字符串:

my $mail = Email::MIME->create(
    header => [
        Subject => '=?UTF-8?B?w4PChHJnZXJsaWNoZSBHcsODwrzDg8KfZQ==?='
    ]
);
Run Code Online (Sandbox Code Playgroud)

引用文档:

header除了 或代替 ,还可以提供类似的参数header_str其值将逐字使用