我有一个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::Cmd中的一个错误引起的,已在3.08中修复。升级Net::Cmd至3.08或更高版本,或通过更改:来更正有问题的行(530和573行附近)
unless (defined($w) && $w == $len) {
至
unless (defined($w) && $w > 0) {
如果需要发送多个区块,即使代码已经正确处理了发送多个块,这一行也会导致连接立即失败。因此,当你必须发送大量邮件时,它会失败,如果没有(没有附件),它会成功。
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从不只是在两者之间关闭连接,如果有意关闭连接,他们总是会返回错误消息。
调试器似乎出现了意外的EOF报告。这是重复的Net::SMTP:Net::Cmd::_is_closed():命令通道[perl]上的意外EOF
新错误:Net::SMTP::SSL: Net::Cmd::datasend(): unexpected EOF on command channel