我已经创建了一个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
******************************************
我无法弄清楚它出了什么问题,
代码:
#!/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";
}
}
答案 0 :(得分:2)
电子邮件地址语法可以是quite complicated。因此,验证可能很棘手 - 很容易出错。我建议在CPAN上探索一个合适的图书馆。
Email::Valid似乎也支持域名检查和TLD检查。 免责声明:我没有亲自使用过这个模块,但它似乎得到了积极维护。
nslookup的输出可能在多次运行脚本之间发生了变化,因此您的脚本可能会报告不一致的结果。我建议添加更多日志语句,以便您可以确定正在发生的事情。
答案 1 :(得分:1)
我建议在所有Perl脚本中使用strict
和warnings
。
使用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";
}
}