2016-04-28 203 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

相關問題