1

我想在客户端的 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(因为文档声称)

4

1 回答 1

2

如果您想使用smtps(即从开始的 TLS 而不是在 STARTTLS 命令之后的 TLS),您必须明确说明。Net::SMTP 不会神奇地从端口号推导出这个要求。从文档中

new ( [ HOST ] [, OPTIONS ] )
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
);
于 2019-03-29T09:49:17.333 回答