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)。
我建议您查看服务器的配置,看看实际需要什么。
我有一个用于发送电子邮件的 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)。
我建议您查看服务器的配置,看看实际需要什么。