电子邮件:: utf8有问题

时间:2014-07-07 12:48:50

标签: perl

我需要验证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;);但这并没有解决它。

感谢您的帮助!

1 个答案:

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