Perl Net中的怪异:: SMTP

时间:2012-08-23 09:20:26

标签: perl email smtp

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

2 个答案:

答案 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建议的块(我在尝试调试此问题时删除了它)修复了这一切。感谢您的帮助 - 非常感谢。