2015-03-31 67 views
0

上我用來發送電子郵件的Perl腳本:的Net :: SMTP凍結某個服務器

#!/usr/bin/perl 

use strict; 
use warnings; 

use Email::Sender::Simple qw(sendmail); 
use Email::Sender::Transport::SMTP(); 
use Email::Simple(); 
use Email::Simple::Creator(); 

my $smtpserver = 'server.com'; 
my $smtpport = 2525; 
my $smtpuser = '[email protected]'; 
my $smtppassword = 'secret'; 

my $transport = Email::Sender::Transport::SMTP->new({ 
    host => $smtpserver, 
    port => $smtpport, 
    sasl_username => $smtpuser, 
    sasl_password => $smtppassword, 
    debug => 1, 
}); 

my $email = Email::Simple->create(
    header => [ 
    To  => '[email protected]', 
    From => "User name <$smtpuser>", 
    Subject => 'Hello', 
    ], 
    body => "This is my message\n", 
); 

sendmail($email, { transport => $transport }); 

它可以在一臺服務器上。但在另一個腳本凍結。調試消息有:

Net::SMTP>>> Net::SMTP(2.31) 
Net::SMTP>>> Net::Cmd(2.29) 
Net::SMTP>>>  Exporter(5.63) 
Net::SMTP>>> IO::Socket::INET(1.31) 
Net::SMTP>>>  IO::Socket(1.31) 
Net::SMTP>>>  IO::Handle(1.28) 

怎麼了?如何調試?

回答

2

如果到服務器的TCP連接已成功建立但服務器未發送預期的SMTP問候,則會發生這種情況。這可能有幾個原因,如:

  • 服務器根本不是SMTP服務器。如果您嘗試對網絡服務器(例如HTTP)使用Net :: SMTP,您將看到類似的結果,因爲HTTP服務器期望客戶端首先發送數據,而使用SMTP服務器將首先發送數據。
  • 服務器配置了隱式TLS,即它正在等待客戶端與TLS連接,而不是與普通SMTP連接。在這種情況下,服務器在發回任何內容之前正在等待客戶端啓動TLS握手(即發送ClientHello)。

我建議你看看服務器的配置,看看實際上是什麼預期。

+0

服務器絕對是一個SMTP服務器。我從本地機器連接到它。但是當我說:「helo server.com 」時,它會迴應。當我從其他服務器連接到此SMTP服務器時 - 它不響應。 – user4035 2015-03-31 07:40:48

+0

從這個描述我會建議,問題出現在服務器端。這可能是服務器將對客戶端的IP進行反向DNS查找,然後超時。或者它會檢查一些實時阻止列表。或者有一個垃圾郵件或類似的程序阻止來自未知客戶端的連接。很難說沒有關於服務器的信息,但我不認爲它是Perl或Net :: SMTP的問題。 – 2015-03-31 07:48:44