无法使用Perl中的Net :: SMTP模块在端口465上提交电子邮件

问题描述 投票:1回答: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本身既支持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(因为文档声称)

perl ssl centos smtp smtps
1个回答
2
投票

如果你想使用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
);
© www.soinside.com 2019 - 2024. All rights reserved.