Net::SMTP::SSL(通过 gmail 和 amazon smtp)- 'Connection Closed' 发送带附件的电子邮件时

Net::SMTP::SSL (via gmail and amazon smtp) - 'Connection Closed' when sending email with attachment

我有一个 perl 导出脚本,它生成一个 .csv 文件,然后通过电子邮件将其发送给用户。我走这条路是因为我们不希望用户必须在特定页面上等待导出完成,而是允许它在后台导出。

但是,当附上 csv 并发送电子邮件时,我收到以下错误:

[Net::SMTP::SSL] Connection closed

我不能在这里放很多代码,但我至少可以告诉你代码的哪一部分报告了这个错误。我想知道这里是否有人知道为什么会发生这种情况,或者有一种简单的调试方法。

这是发送电子邮件的代码块(在报告错误的地方有注释):

my $mailer = new Net::SMTP::SSL($smtp, Port => $port) or die "Cannot create a SSL mailer instance!\n";
$mailer->auth($user, $pass) or die ("Can't authenticate");

$mailer->mail($email) or die $mailer->message;
$mailer->to(split(',', $to)) or die $mailer->message;
$mailer->data() or die $mailer->message;
$mailer->datasend($msg->as_string) or die $mailer->message; # Connection closed
$mailer->dataend() or die $mailer->message;
$mailer->quit() or die $mailer->message;

如果需要任何其他信息,请告诉我。我会尽我所能。这很难解决,因为错误太模糊了。

注意: 删除违规附件后邮件成功发送,有时会根据 csv 内容发送。

Net::SMTP 也支持 SSL。您可能想尝试将其作为 Net::SMTP::SSL 的直接替代品,但我怀疑它是否会产生很大的不同。

尝试启用调试模式以查看发生了什么:

my $mailer = new Net::SMTP::SSL($smtp, Port => $port, Debug => 1) or die "Cannot create a SSL mailer instance!\n";

您应该尝试找出问题是否与从特定大小(1k?8k?)开始的电子邮件有关。

Gmail 绝不会仅仅关闭其间的连接,如果连接有意关闭,它们总是 return 一条错误消息。

调试器似乎报告了意外的 EOF。这是重复的 Net::SMTP: Net::Cmd::_is_closed(): unexpected EOF on command channel [perl]

新错误:Net::SMTP::SSL: Net::Cmd::datasend(): unexpected EOF on command channel

这是由 Net::Cmd 中的错误引起的,已在 3.08 中修复。将 Net::Cmd 升级到 3.08 或更高版本,或更正有问题的行(大约第 530 行和 573 行),方法是更改​​:

  unless (defined($w) && $w == $len) {

  unless (defined($w) && $w > 0) {

如果需要发送多个数据块,该行会导致连接立即失败,即使代码已经正确处理了多个数据块的发送。因此,当您必须发送大量金额时,它会失败,如果没有(没有附件)它会成功。