我想用Email::Stuffer
发送一封简单的电子邮件。正如预期的那样,它将带有非Asynchronous字符的标题编码为编码的单词。但是当我解码它们时(无论是在我的邮件客户端还是在Perl中),我得到了不同的文本,MIME::Base64
以不同的方式编码相同的文本。
use strict;
use warnings;
use Email::Stuffer;
use MIME::Base64;
my $text = 'Ümläut';
print "$text in base64: ", encode_base64($text, ''), "\n";
print "and back: ", decode_base64(encode_base64($text)), "\n";
my $stuffer = Email::Stuffer->subject($text);
my $dump = $stuffer->as_string();
print "Mail dump:\n---\n$dump\n---\n";
$dump =~ m{^Subject:\s*=\?UTF-8\?B\?(.+)\?=}m;
my $encoded = $1;
print "in Subject: $encoded\n";
my $decoded = decode_base64($encoded);
print "subject decoded: $decoded\n";
这将打印:
Ümläut in base64: w5xtbMOkdXQ=
and back: Ümläut
Mail dump:
---
Date: Sat, 7 Oct 2023 16:31:59 -0500
MIME-Version: 1.0
Subject: =?UTF-8?B?w4PCnG1sw4PCpHV0?=
---
in Subject: w4PCnG1sw4PCpHV0
subject decoded: Ãmläut
( shell 上的echo "Ümläut" | base64
与MIME::Base64
一致,并且还打印w5 xtbMOkdXQK)
程序源代码在utf8中。当我在use warnings;
之后添加use utf8;
时,第一个print
s不会打印预期的变音符号,但Email::Stuffer
可以按预期工作。
�ml�ut in base64: 3G1s5HV0
and back: �ml�ut
Mail dump:
---
Date: Sat, 7 Oct 2023 16:32:50 -0500
MIME-Version: 1.0
Subject: =?UTF-8?B?w5xtbMOkdXQ=?=
---
in Subject: w5xtbMOkdXQ=
subject decoded: Ümläut
这里有什么区别/为什么会发生这种情况,我如何让MIME::Base64
和Email::Stuffer
都同意?
1条答案
按热度按时间ej83mcc01#
->subject
需要文本(解码文本,Unicode代码点字符串)。encode_base64
需要字节(例如使用UTF-8编码的文本)。固定: