我想在客户端的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上的“提交”服务的请求(因为该文档声称)
答案 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
);