2012-02-26 19 views
1

我有一個Perl應用程序,應該發送電子郵件到大量的收件人。它似乎工作正常,但經過約9K以電子郵件形式發送失敗:無法調用方法「身份驗證」在一個未定義的值..後許多成功的運行

Can't call method "auth" on an undefined value at... 

在代碼中,我看到:

# Open a connection to the SendGrid mail server 
    my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN); 

    # Authenticate 
    my $code = $smtp->auth($USERNAME, $PASSWORD); 

顯然,在應用程序沒有語法錯誤,因爲它工作在第一。 我使用Google搜索和搜索這個網站,但找不到任何東西...

我將不勝感激任何意見。

+0

聞起來像內存泄漏。 – 2012-02-26 04:03:38

+0

很有可能。這怎麼會出現問題? – user1233351 2012-02-26 04:24:40

回答

3

如果出現問題(例如無法連接到smtp.xyz.net上的端口25),則Net::SMTP構造函數將返回undef。您沒有檢查,並且當您嘗試調用undef上的方法時,您會收到您提到的錯誤消息。

my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN) 
    or die "Failed to open SMTP connection: $!"; 

可以給你更多的信息。 (雖然它不一定是套接字錯誤,所以$!可能不包含任何有用的東西。)

2

Net::SMTP documentation說,當一個方法失敗時,它返回undef。所以我希望你的方法調用失敗。

您可能可以通過在Net :: SMTP構造函數中啓用Debug => 1標誌來獲取更多信息。

您將希望檢測到您的方法調用失敗,並可能在短暫的等待後重試它。

# Open a connection to the SendGrid mail server 
    my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN, Debug=>1); 

    die "Failed to make connection" unless ($smtp); 

    # Authenticate 
    my $code = $smtp->auth($USERNAME, $PASSWORD); 
+0

明白,所以如果$ smtp是壞的,我應該重試。我如何測試$ stmp的不正確? – user1233351 2012-02-26 04:27:08

2

你可以改變它在增加的間隔這樣 東西重試:

my $retry = 10; # in seconds; 
my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN); 
while (not defined $smtp) { 
    if ($retry > 300) { 
    die "could not connect to smtp server, giving up"; 
    else { 
    print "could not connect to smtp, retrying in $retry seconds\n"; 
    } 
    sleep ($retry); 
    $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN); 
    $retry *= 2; 
} 

# Authenticate 
my $code = $smtp->auth($USERNAME, $PASSWORD); 
+0

tnx很多。我要去試試這個代碼。 順便說一句,有沒有辦法「關閉」該smtp連接?我認爲代碼泄露了這些資源。 – user1233351 2012-02-26 18:36:57

+0

$ smtp-> quit()會關閉連接,但我不能說如果沒有看到完整的代碼,它是否真的能幫助你解決泄漏問題。 – AntonioD 2012-02-27 01:08:02

相關問題