0

在 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;
}
4

2 回答 2

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;
}
于 2012-08-23T09:43:25.217 回答
0

解决。这条尾巴在两腿之间稍稍。事实证明,已经就这个问题联系了给我的 IP 列表,因此有些人已经开始采取措施解决这个问题。一种这样的措施是使用与受信任中继不同的源 IP 阻止 TCP 端口 25(不是我的 IP,只是为了澄清)。因此,创建 Net::SMTP 只是失败了。因此,重新引入 Borodin 建议的块(我在尝试调试此问题时已将其删除)修复了所有问题。感谢您的帮助 - 非常感谢。

于 2012-08-27T04:13:41.350 回答