【问题标题】:Weirdness in Perl Net::SMTPPerl Net::SMTP 中的怪异
【发布时间】: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 的值,它在第三次失败。如果我手动设置第五次迭代(即数组的特定元素不是问题),也会发生同样的情况。

标签: perl email smtp


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2017-12-30
      • 2016-03-21
      • 2012-06-16
      • 1970-01-01
      • 2010-09-16
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多