在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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
解决。在这一条腿之间略微尾巴。事实证明,已经与我联系了关于该问题的知识产权清单,因此有些已经开始采取措施来解决问题。其中一个措施就是阻止TCP端口25,其源IP与可信中继不同(不仅仅是我的IP澄清)。因此,创建Net :: SMTP只是失败了。因此,重新引入Borodin建议的块(我在尝试调试此问题时删除了它)修复了这一切。感谢您的帮助 - 非常感谢。