电子邮件地址不仅包含以下部分:
localpart@domain.tld
下一行中的完整字符串(包括引号之间的部分,引号本身和尖括号)也是有效地址:
“John Doe”< localpart@domain.tld>
当我用自己的名字替换“John Doe”时,我得到一个地址,我可以在我的电子邮件客户端输入,而不会收到任何投诉(注意»ö«in我的姓氏是非ascii字符):
“HubertSchölnast”< localpart@domain.tld>
所以看起来(对于像Thunderbird这样的标准电子邮件客户端的用户),好像引用部分中的特殊字符没问题。
但是当我使用cpan-module Email :: Valid 在perl脚本中检查这个完整的电子邮件地址时,我收到错误,说这个地址与rfc822的规则不匹配,以及该模块的文档说,rfc822不允许在电子邮件地址的任何部分使用任何非ascii字符。 (当我省略字母ö或用ascii字母替换它时,检查表明地址有效。)
显然,任何电子邮件客户端都必须在向smtp服务器发送电子邮件之前对其进行编码,并且必须在收到新电子邮件时对其进行解码并向其显示标题信息。用户。但是我无法知道这是如何完成的,而且我在谷歌搜索方面确实做到了最好。
我需要这种编码算法,因为我想编写一个perl脚本,它接受任何有效的电子邮件地址(在引用部分中也包含特殊字符),然后发送电子邮件到这些地址。
答案 0 :(得分:3)
Perl核心有Encode.pm
:
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
my $from_header = decode_utf8 q{From: "Hubert Schölnast" <localpart@domain.tld>};
print encode('MIME_Header', $from_header);
1;
__END__
From: "=?UTF-8?B?SHViZXJ0IFNjaMO2bG5hc3Q=?=" <localpart@domain.tld>
RFC822 / 2822背后有许多要求使得处理电子邮件变得困难。
RFC2822还禁止邮件中的每一行超过998个字符。 必须通过缩进延续线来将长行拆分为多行。
这意味着每当我们修改它们时,我们必须注意行长度,只需转换特殊字符后并添加标题标签。
答案 1 :(得分:1)
使用MIME::Words对地址,主题等进行编码或解码。
E.g。在创建电子邮件时:
upload
要使用地址对名称进行编码,请使用#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use MIME::Words qw{ encode_mimeword };
my $encoded = encode_mimeword('Hubert Schölnast');
。
处理电子邮件时,请改用encode_mimewords
。