2015-05-19 35 views
3

电子邮件,不会忽略不只是由这几部分组成:如何在特殊字符进行编码的电子邮件,不会忽略

[email protected]

在未来的完整的字符串线(包括引号之间的部分中,引号本身和尖括号中)也是有效的地址:

“John Doe的” <[email protected]>

当我更换“李四”以我个人的名义,我得到一个地址,我可以在我的电子邮件客户端输入没有得到任何投诉(请注意我的最后»ö«名称,即非ASCII字符):

“休伯特Schölnast” <[email protected]>

如此看来(一个标准的电子邮件客户端雷鸟一样的用户),好像特殊字符在引用的部分是好的。

但是,当我在一个perl脚本检查这个完整的电子邮件ADRESS与CPAN模块电子邮件::有效我得到一个错误,说这个地址不匹配RFC822的规则,和文档该模块说,rfc822不允许在电子邮件地址的任何部分使用任何非ascii字符。 (当我省略了信ö或用ASCII字母代替它,检查说的地址是有效的。)

所以,很显然它发送之前的任何电子邮件客户端必须进行编码的电子邮件地址一封电子邮件给smtp服务器,并且必须在收到新电子邮件并向用户显示标题信息时对其进行解码。但我不明白这是如何完成的,并且我在Google上做了很多努力。

我需要这种编码算法,因为我想编写一个接受任何有效的电子邮件地址(也在引用部分中带有特殊字符)的perl脚本,然后向这些地址发送电子邮件。

+0

顺便说一句,你的真名的双引号不是必需的,只是看起来像你把它放在引号中,因为它不是你的“真实”的名字。 (或者,或者你正在使用来自微软的电子邮件软件。无论哪种方式,令人尴尬。) – tripleee

+0

@tripleee:嗯,这是我的真实姓名(查看我的个人资料)。但是,当名称包含特殊字符时,某些电子邮件客户端(不确定哪一个)需要引号。 –

+0

当您对RFC2047进行编码时,该值不再包含任何特殊字符。 – tripleee

回答

3

Perl的核心有Encode.pm

#!/usr/bin/perl 
use strict; 
use warnings; 
use Encode; 

my $from_header = decode_utf8 q{From: "Hubert Schölnast" <[email protected]>}; 
print encode('MIME_Header', $from_header); 

1; 
__END__ 
From: "=?UTF-8?B?SHViZXJ0IFNjaMO2bG5hc3Q=?=" <[email protected]> 

有很多的背后RFC822/2822的要求,使得它很难处理电子邮件。

RFC2822还禁止消息中的每行超过998个字符。 长线必须通过缩进连续线来分割成多行。

这意味着我们必须注意行长度,只要我们修改它们只需之后转换特殊字符和预先标题标签。

+1

提示:这假设一个UTF-8编码的源文件。在这种情况下,使用'use utf8;'。然后,你不必在任何地方使用'decode_utf8'。 – ikegami

+0

@ernix:谢谢!我希望,cpan-modul Email:Sender能正确处理line-lenght和所有这些东西。这就是我使用模块的原因。 –

+0

我在我的邮件服务器上搜索了存储我所有电子邮件的文件,并发现我的地址存储的方式正是通过encode('MIME_Header',$ address)'生成的。谢谢! (并且我总是在所有脚本中使用'use utf8;',所以不需要'decode_utf8'。) –

1

使用MIME::Words编码或解码的地址,主题等

例如创建电子邮件时:

#!/usr/bin/perl 
use strict; 
use warnings; 
use utf8; 

use MIME::Words qw{ encode_mimeword }; 

my $encoded = encode_mimeword('Hubert Schölnast'); 

为了与地址编码名称,使用encode_mimewords

处理电子邮件时,请改为使用decode_mimewords

+0

也可能链接到定义此编码的[RFC2047](https://www.ietf.org/rfc/rfc2047.txt)。 – tripleee

+0

将此方法用于完整地址(*“HubertSchölnast”<[email protected]> *)是否安全? –

+0

@tripleee:感谢您的链接,但RFC始终如此长,难以阅读。是否有一个简短的算法描述? –

相关问题