我想在客户端的 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 本身就支持基于 SSL 的 SMTP,也支持 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(因为文档声称)