2012-08-23 31 views
0

在用于循环,当我遇到一些麻烦的Net :: SMTP。 第一次迭代的作品,但在第二次迭代的脚本就死在......一个未定义的值无法调用“邮件”,行称作是怪诞在Perl的Net :: SMTP

$smtp->mail('[email protected]'); #from. 

任何想法?谢谢你的时间!

use strict; 
use warnings; 

use Net::SMTP; 

my $smtp; 

#@data is defined and populated somewhere 

foreach my $line (@data) { 

    my @linearray = split /,/, $line; 
    my $host = $linearray[2]; 

    $host =~ s/\r|\n//g; 

    next unless ($host =~ m/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}).([0-9]{1,3})/); # skip if it's not an IP (i.e. it's the header row) 
    print "Connecting to $host..."; 

    # create object 
    $smtp = Net::SMTP->new(
    Hello => 'hacker.net', 
    Timeout => 3, 
    Host => $host, 
    Debug => 1, 
); 
    $smtp->mail('[email protected]'); #from 
    my $tocheck = $smtp->recipient('[email protected]'); #to 
    if ($tocheck == 0) { 
    print "$host is NOT an open relay\n"; 
    #$smtp->quit; 
    next; 
    } 

    $smtp->data(); 
    $smtp->datasend("Test\n"); 
    $smtp->datasend("\n"); 
    $smtp->datasend("A simple test message\n"); 
    $smtp->dataend(); 
    $smtp->quit; 
} 
+0

旁注:我觉得有一个在IP匹配线一个错字,在正则表达式的最后一个元组的部分:'[0〜+ 9]'应该是'[0-9]'。而且,前面的分隔符点不会被转义。 – zb226

+0

你连接的第二台主机是什么?如果你拿出第二条线,它是否工作?无论如何,您应该检查'Net :: SMTP :: new()'的返回值。 – tripleee

+0

坦克zb226 - 不知道在那里 – James

回答

1

我猜你的$host没有一个有效的SMTP服务器地址。正则表达式只检查是否包含的东西,可能是一个有效的IP地址的地方。例如,999.999.999.999无效。此外空格可能会破坏的东西,所以' 127.0.0.1 '也不会工作。最后,在该地址可能没有可用的SMTP服务器,即使它是合法的IP地址,因此您的构造器可能会失败。

此替代正则表达式检查整个字符串是否与每个字段中仅有0..255个值的有效IP地址匹配。

/\A(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\z/ 

您应该检查构造函数的返回值,并警告,如果它失败:

$smtp = Net::SMTP->new(
    Hello => 'hacker.net', 
    Timeout => 3, 
    Host => $host, 
    Debug => 1, 
); 
unless ($smtp) { 
    warn "Unable to connect to to SMTP server '$host'"; 
    next; 
} 
0

解决。这一个之间的腿稍微尾巴。事实证明,给我IP列表已经联系到了这个问题,因此,有些已经开始把措施来解决这个问题。其中一种措施是阻止TCP端口25的源IP与可信中继不同(不是我的IP只是为了说明)。因此创建Net :: SMTP只是失败。所以重新引入Borodin建议的块(我试图调试这个问题时删除了这个块)将它修复了一切。感谢您的帮助球员 - 非常感谢。