【发布时间】:2012-08-27 12:13:41
【问题描述】:
当在 for 循环中使用 Net::SMTP 时,我遇到了一些问题。 第一次迭代有效,但在第二次迭代中,脚本因无法在未定义的值上调用方法“mail”而终止...,该行被称为
$smtp->mail('hacker@hacker.net'); #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('hacker@hacker.net'); #from
my $tocheck = $smtp->recipient('my_email@sanitised.com'); #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;
}
【问题讨论】:
-
旁注:我认为 IP 匹配行中有错字,在最后一个元组的正则表达式部分:
[0-+9]应该是[0-9]。此外,前面的分隔符点也不会转义。 -
您要连接的第二台主机是什么?如果你取出第二条线,它会起作用吗?无论如何,您应该检查来自
Net::SMTP::new()的返回值。 -
坦克 zb226 - 不知道那个错字是怎么进来的
-
所有IP都是有效的,并且已经事先检查过了。问题似乎在循环中。如果我复制 #create 对象块并将 $host 设置为每个实例的唯一固定值,它就可以工作。或者,如果我调整脚本以便它从数组中读取第一次和第三次迭代,但手动设置第二次迭代的 $host 的值,它在第三次失败。如果我手动设置第五次迭代(即数组的特定元素不是问题),也会发生同样的情况。