我需要验证From:字段unicode字符中的一些电子邮件地址,例如:
From: =?iso-8859-1?Q?Jos=E9_name?= <J.name@domain.tld>
此值保存在$ from变量中。
使用此代码
my $validator = Email::Valid->new();
my $addr = $validator->address( $from );
print $addr, "\n";
我在
中使用未初始化的值$ addr相同的代码适用于不包含unicode字符的值。我尝试过使用binmode(STDIN,&#39;:utf8&#39;);但这并没有解决它。
感谢您的帮助!
答案 0 :(得分:0)
正如cross post在评论中提到的toolic所述:
问题是来自地址是电子邮件标题部分。在标题中,只有ASCII有效。这就是为什么只有ASCII编码的字符串才有效的原因。因此,包含非ascii字符
é
的单词被编码为=?iso-8859-1?Q?Jos=E9_Name?=
。当您将此字节字符串带入验证例程时,一切都很好。所以,恕我直言,解决方案必须是你在一个有效的ascii表示中编码代表电子邮件地址的unicode字符串。
#!/bin/perl use strict; use warnings; use 5.010; use Email::Valid; use Data::Dumper; use Encode qw(encode decode); my $utf8_from = decode('UTF-8', 'José <J.name@web.de>'); my $from = encode('MIME-Header', $utf8_from); say "Mail: $from"; my $validator = Email::Valid->new(); if(my $addr = $validator->address( $from )) { say "OK: ", Dumper($addr); } else { say "Not valid"; }
输出:
Mail: =?UTF-8?B?Sm9zw6kg?=<J.name@web.de> OK: $VAR1 = 'J.name@web.de';