0

for ループで Net::SMTP を使用すると問題が発生します。最初の反復は機能しますが、2 回目の反復で、スクリプトは Can't call method "mail" on an undefined value at... で終了します。

$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 'どちらも機能しません。最後に、たとえそれが正当な IP アドレスであっても、そのアドレスで動作している SMTP サーバーがない可能性があるため、いずれにせよコンストラクターが失敗する可能性があります。

この代替正規表現は、文字列全体が有効な IP アドレスと一致し、各フィールドの値が 0..255 のみであることを確認します。

/\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

解決しました。この 1 つの脚の間で尾をわずかに付けます。私に提供された IP のリストには、既にこの問題について連絡があったため、問題を解決するための対策を講じ始めていることが判明しました。そのような手段の 1 つは、信頼できるリレーとは異なるソース IP で TCP ポート 25 をブロックすることでした (明確にするために、私の IP ではありません)。したがって、Net::SMTP の作成は単純に失敗していました。そのため、Borodin によって提案されたブロック (この問題をデバッグしようとしたときに削除したもの) を再導入すると、すべてが修正されました。助けてくれてありがとう - どうもありがとう。

于 2012-08-27T04:13:41.350 に答える