gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:01 37 4
gpt4 key购买 nike

我想在客户端的 perl 脚本中使用 Net::SMTP 模块(不使用 Net::SMTP::SSL)在我的 smtp 服务器的端口 465 上提交电子邮件。在我的 SMTP 服务器的端口 465 上,“提交”服务运行,它理解 SMTPS。

我试图在谷歌上找到执行此操作的方法。然后使用 Net::SMTP::SSL 模块在端口 465 上发出请求。它工作正常。

但是 Net::SMTP::SSL 的文档建议使用最新版本的 Net::SMTP 而不是使用 Net::SMTP::SSL。文档明确指出

Since Net::SMTP v1.28 (2014-10-08), Net::SMTP itself has support for SMTP over SSL, and also for STARTTLS. Use Net::SMTP, not Net::SMTP::SSL.

我已将 Net::SMTP 模块更新到最新版本 3.11。

还有 Net::SMTP 的文档还明确表示

With IO::Socket::SSL installed it also provides support for implicit and explicit TLS encryption, i.e. SMTPS or 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 模块,而不使用 Net::SMTP::SSL(因为文档声称)在 SMTP 服务器上监听端口 465 的“提交”服务请求

最佳答案

如果您想使用 smtps(即从开始的 TLS 而不是 STARTTLS 命令之后的 TLS),您必须明确说明。 Net::SMTP 并没有神奇地从端口号中得出这个要求。来自 the documentation :

new ( [ HOST ] [, OPTIONS ] )
SSL - If the connection should be done from start with SSL, contrary to later upgrade with starttls. You can use SSL arguments as documented in IO::Socket::SSL, but it will usually use the right arguments already.

因此,正确的代码应该是:

$smtp = Net::SMTP->new($mailserver,
SSL => 1, # <<<<<<<<<<<<<<<<<<<<<<<< THIS IS IMPORTANT
Hello => $localhostname,
Timeout => 60,
Port => $port, # Port value is 465
Debug => 1
);

关于perl - 无法使用 Perl 中的 Net::SMTP 模块在端口 465 上提交电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413518/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com