2012-08-23 32 views
0

在用於循環,當我遇到一些麻煩的Net :: SMTP。 第一次迭代的作品,但在第二次迭代的腳本就死在......一個未定義的值無法調用「郵件」,行稱作是怪誕在Perl的Net :: SMTP

$smtp->mail('[email protected]'); #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('[email protected]'); #from 
    my $tocheck = $smtp->recipient('[email protected]'); #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

旁註:我覺得有一個在IP匹配線一個錯字,在正則表達式的最後一個元組的部分:'[0〜+ 9]'應該是'[0-9]'。而且,前面的分隔符點不會被轉義。 – zb226

+0

你連接的第二臺主機是什麼?如果你拿出第二條線,它是否工作?無論如何,您應該檢查'Net :: SMTP :: new()'的返回值。 – tripleee

+0

坦克zb226 - 不知道在那裏 – James

回答

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

解決。這一個之間的腿稍微尾巴。事實證明,給我IP列表已經聯繫到了這個問題,因此,有些已經開始把措施來解決這個問題。其中一種措施是阻止TCP端口25的源IP與可信中繼不同(不是我的IP只是爲了說明)。因此創建Net :: SMTP只是失敗。所以重新引入Borodin建議的塊(我試圖調試這個問題時刪除了這個塊)將它修復了一切。感謝您的幫助球員 - 非常感謝。