Net::SMTP 在某台服务器卡住

Net::SMTP freezes on a certain server

我有一个用于发送电子邮件的 Perl 脚本:

#!/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   = 'test@server.com';
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      => 'myself@gmail.com',
    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)

怎么了?如何调试?

如果与服务器的 TCP 连接已成功建立,但服务器未发回预期的 SMTP 问候语,则会发生这种情况。这可能有多种原因,例如:

  • 该服务器根本不是 SMTP 服务器。如果您尝试对 Web 服务器(例如 HTTP)使用 Net::SMTP,您将看到类似的结果,因为 HTTP 服务器期望客户端首先发送数据,而对于 SMTP,服务器将首先发送数据。
  • 服务器配置了隐式 TLS,即它正在等待客户端使用 TLS 而不是普通 SMTP 连接。在这种情况下,服务器在发送回任何内容之前等待客户端开始 TLS 握手(即发送 ClientHello)。

我建议您查看服务器的配置,看看实际需要什么。