2015-03-31 70 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