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