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

时间:2019-03-29 08:46:28

标签: perl ssl centos smtp smtps

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

我试图找到在Google上执行此操作的方法。然后使用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模块而不使用Net :: SMTP :: SSL来发出对SMTP服务器上端口465上的“提交”服务的请求(因为该文档声称)

1 个答案:

答案 0 :(得分:2)

如果您想使用smtps(即,从开始使用TLS,而在STARTTLS命令之后使用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
);