如何在电子邮件地址中编码特殊字符

时间:2015-05-19 11:56:40

标签: perl email encoding special-characters

电子邮件地址不仅包含以下部分:

  

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脚本,它接受任何有效的电子邮件地址(在引用部分中也包含特殊字符),然后发送电子邮件到这些地址。

2 个答案:

答案 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