2016-04-28 110 views
1

我有一个perl导出脚本,它会生成一个.csv文件,然后通过电子邮件发送给用户。我已经走下了这条路,因为我们不希望用户不得不在特定的页面上等待导出完成,而是允许它在后台导出。Net :: SMTP :: SSL(通过Gmail和亚马逊smtp) - 连接关闭时发送电子邮件附件

然而,当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内容发送。

+0

请添加所有详细信息以使问题可重现。如果问题只发生在特定邮件内容中,则需要将此内容添加到问题中。请参见[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

@SteffenUllrich尽管我希望我可以添加csv的内容,但所讨论的内容是我无法提供的敏感数据。我明白,这只会让事情变得复杂,但我对这些问题有所认识,看看是否有人遇到了某些内容导致拒绝/关闭与gmail的smtp连接的问题。 – jardis

+0

您不需要添加导致问题的原始(敏感)内容,但仅导致问题的一些(非敏感)内容就足够了。我怀疑你不会得到帮助,你承认奇怪的问题是没有办法重现它。另外请确保您使用的是最新版本的Net :: SMTP(由Net :: SMTP :: SSL使用),以防已知但已修复的错误。 –

回答

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从不关闭中间连接,如果连接被打算关闭,它们总是返回错误消息。

+1

我会尝试使用调试模式,以及使用Net :: SMTP。感谢您的替代方案,如果解决了问题,我会尽快回复您,或者回答一下调试器是否可以解决问题。 – jardis

1

这是由网:: Cmd的一个bug,定格在3.08引起的。升级的Net :: Cmd的3.08或更高版本,或通过改变纠正违规线(大约530线和573):

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

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

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

+0

感谢您的洞察力,在接受您的答案之前,我将不得不验证这种情况,但它听起来很有用。 – jardis

+0

这是我在Ubuntu的16.04有3.05。 – stefanct

相关问题