用于电子邮件验证的Perl脚本?

时间:2013-12-26 12:28:15

标签: perl validation scripting ubuntu-12.04 email-validation

我已经创建了一个perl脚本来验证我的营销团队发送广告系列的电子邮件ID。

脚本表现不正常。

例如,我在不同的日期验证了135个电子邮件ID

******************************************
Date   |    Valid     | Invalid  | Total
******************************************
23-Dec-13    45       |   90     | 135
******************************************
24-Dec-13    90       |   45     | 135
******************************************
25-Dec-13    133      |   02     | 135
******************************************

我无法弄清楚它出了什么问题,

Link to code

代码:

 #!/usr/bin/perl
 use Data::Dumper;

 %lookup_cache = ();

 sub valid_address {
   my($addr) = @_;
   my($domain, $valid);

   # Lower-case address
   $addr = lc($addr);

   # Validate format of address
   return(0) unless ($addr =~ /^[^@]+@([-\w]+\.)+[a-z]{2,4}$/);

   # Grab domain
   $domain = (split(/@/, $addr))[1];

   # Lookup and return cached result if it exists
   $cached_result = $lookup_cache{$domain};
   if ($cached_result ne '')
   {
     #print "[cached_result] ";
     return $cached_result;
   }

   # Do domain lookup
   $valid = 0;
   if (open(DNS, "nslookup -q=any $domain |"))
   {
     while (<DNS>) {
       $valid = 1 if (/^$domain.*\s(mail exchanger|internet address)\s=/i);
     }
   }

   # Store cached result for later
   $lookup_cache{$domain} = $valid;

   return $valid;
 }

 while (<>) {
   $addy = $_;
   $addy =~ s/\s+$//;
   if ($addy)
   {
     print "$addy " . (valid_address($addy) ? 'valid' : 'invalid') . "\n";
   }
 }

2 个答案:

答案 0 :(得分:2)

电子邮件地址语法可以是quite complicated。因此,验证可能很棘手 - 很容易出错。我建议在CPAN上探索一个合适的图书馆。

Email::Valid似乎也支持域名检查和TLD检查。 免责声明:我没有亲自使用过这个模块,但它似乎得到了积极维护。

nslookup的输出可能在多次运行脚本之间发生了变化,因此您的脚本可能会报告不一致的结果。我建议添加更多日志语句,以便您可以确定正在发生的事情。

答案 1 :(得分:1)

我建议在所有Perl脚本中使用strictwarnings

使用nslookup -q=MX请求邮件交换器记录以使脚本稳定。 nslookup -q=any 的输出可能包含MX记录但不总是(我猜它会返回它找到的任何记录类型,不一定是MX?)。

编辑:此脚本适用于我:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %lookup_cache = ();

sub valid_address {
  my($addr) = @_;
  my($domain, $valid);

  # Lower-case address
  $addr = lc($addr);

  # Validate format of address
  return(0) unless ($addr =~ /^[^@]+@([-\w]+\.)+[a-z]{2,4}$/);

  # Grab domain
  $domain = (split(/@/, $addr))[1];

  # Lookup and return cached result if it exists
  my $cached_result = $lookup_cache{$domain};
  if (defined $cached_result)
  {
    return $cached_result;
  }

  # Do domain lookup
  $valid = 0;
  if (open(DNS, "nslookup -q=MX $domain |"))
  {
    while (<DNS>) {
      $valid = 1 if (/^$domain.*\s(mail exchanger|internet address)\s=/i);
    }
  }

  # Store cached result for later
  $lookup_cache{$domain} = $valid;

  return $valid;
}

while (<>) {
  my $addy = $_;
  $addy =~ s/\s+$//;
  if ($addy)
  {
    print "$addy " . (valid_address($addy) ? 'valid' : 'invalid') . "\n";
  }
}
相关问题