perl - 为什么 Email::Stuffer base64 编码与 MIME::Base64 不同以及 utf8 如何适应?

标签 perl email utf-8 base64

我想使用 Email::Stuffer 发送一封简单的电子邮件。正如预期的那样,它将带有非 ASCII 字符的 header 编码为 encoded words 。但是当我将它们解码回来时(无论是在我的邮件客户端还是在 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"| base64MIME::Base64 一致,并且还打印 w5xtbMOkdXQK)

程序源代码为utf8。当我在 use warnings; 之后添加 use utf8; 时,第一个 print 不会打印预期的元音变音,而是 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::Base64Email::Stuffer 达成一致?

最佳答案

->subject 需要文本(解码后的文本、Unicode 代码点字符串)。

encode_base64 需要字节(例如使用 UTF-8 编码的文本)。

已修复:

use strict;
use warnings;
use feature qw( say );

use utf8;                               # Source code is encoded using UTF-8.
use open ':std', ':encoding(UTF-8)';    # Terminal expects/provides UTF-8.

use Email::Stuffer qw( );
use Encode         qw( decode encode );
use MIME::Base64   qw( decode_base64 encode_base64 );

my $text_ucp = 'Ümläut';                # String of Unicode Code Points.
say $text_ucp;                          # Ümläut

my $text_utf8_base64 = encode_base64( encode( "UTF-8", $text_ucp ), '');
say $text_utf8_base64;                  # w5xtbMOkdXQ=

my $roundtrip_ucp = decode( "UTF-8", decode_base64( $text_utf8_base64 ) );
say $roundtrip_ucp;                     # Ümläut

my $stuffer = Email::Stuffer->subject( $text_ucp );
print $stuffer->as_string();            # =?UTF-8?B?w5xtbMOkdXQ=?=

关于perl - 为什么 Email::Stuffer base64 编码与 MIME::Base64 不同以及 utf8 如何适应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77251616/

相关文章:

multithreading - 如何在 Perl 中处理具有依赖关系的调度线程?

PHP:PEAR 邮件消息错误

c# - 如何从角色中获取数据

python - 如何检查字符串是否只包含 UTF-8 字符

python/objective-c utf8 比较不同

perl - 使用 WWW::Mechanize 访问链接时出错

perl - 如何使用 Perl 判断两个文件的内容是否相同?

linux - Perl inotify2 每次文件修改触发两次

c# - 防止反病毒阻止使用 C# 发送的电子邮件

java - 如何在 Liferay 中将 freemarker 电子邮件模板作为电子邮件传递?