我想在客户端的perl脚本中使用Net :: SMTP模块(不使用Net :: SMTP :: SSL)在我的smtp服务器的端口465上提交电子邮件。在我的SMTP服务器的端口465上,运行“提交”服务,该服务了解SMTPS。
我试图在谷歌上找到这样做的方法。然后使用Net :: SMTP :: SSL模块在端口465上发出请求。它工作正常。
但Net::SMTP::SSL的文档建议使用最新版本的Net :: SMTP,而不是使用Net :: SMTP :: SSL。该文件明确指出
自Net :: SMTP v1.28(2014-10-08)以来,Net :: SMTP本身既支持SMTP over SSL,也支持STARTTLS。使用Net :: SMTP,而不是Net :: SMTP :: SSL。
我已将Net :: SMTP模块更新到最新版本3.11。
此外,Net::SMTP的文件也明确指出
安装IO :: Socket :: SSL后,它还支持隐式和显式TLS加密,即SMTPS或SMTP + STARTTLS。
客户端上我的perl脚本代码部分与提到的问题相关,如下所示:
$smtp = Net::SMTP::SSL->new("$mailserver",
Hello => "$localhostname",
Timeout => 60,
Port => "$port", //Port value is 465
Debug => 1);
$smtp->auth($username, $password);
...设置发送者,接收者身体等的剩余脚本
这很好用。电子邮件已提交。用以下代码替换上面的代码:
$smtp = Net::SMTP->new("$mailserver",
Hello => "$localhostname",
Timeout => 60,
Port => "$port", //Port value is 465
Debug => 1);
$smtp->auth($username, $password);
...设置发送者,接收者身体等的剩余脚本
这失败了。调试日志如下所示:
Net::SMTP>>> Net::SMTP(3.11)
Net::SMTP>>> Net::Cmd(3.11)
Net::SMTP>>> Exporter(5.73)
Net::SMTP>>> IO::Socket::INET(1.39)
Net::SMTP>>> IO::Socket(1.39)
Net::SMTP>>> IO::Handle(1.39)
Net::SMTP: Net::Cmd::getline(): unexpected EOF on command channel: at fescommon/mailsend-new.pl line 67.
Can't call method "auth" on an undefined value at fescommon/mailsend-new.pl line 74.
注意:Net :: SMTP,Net :: SMTP :: SSL,IO :: Socket :: SSL等模块都已更新到最新版本。
预期结果是,可以使用最新的Net :: SMTP模块在SMTP服务器上侦听端口465上的“提交”服务请求,而不使用Net :: SMTP :: SSL(因为文档声称)
如果你想使用smtps
(即在STARTTLS命令之后从TLS开始而不是TLS),你必须明确地这样说。 Net :: SMTP不会从端口号神奇地导出此要求。来自the documentation:
新的([主机] [,选项]) SSL - 如果连接应该从使用SSL开始,则与稍后使用starttls进行升级相反。您可以使用IO :: Socket :: SSL中记录的SSL参数,但它通常会使用正确的参数。
因此,正确的代码应该是:
$smtp = Net::SMTP->new($mailserver,
SSL => 1, # <<<<<<<<<<<<<<<<<<<<<<<< THIS IS IMPORTANT
Hello => $localhostname,
Timeout => 60,
Port => $port, # Port value is 465
Debug => 1
);