2016-04-28 5 views
1

Ich habe ein Perl-Export-Skript, das eine .csv-Datei generiert und dann an den Benutzer sendet. Ich bin diesen Weg gegangen, weil wir nicht möchten, dass der Benutzer auf einer bestimmten Seite auf den Export warten muss, sondern dass er im Hintergrund exportiert wird.Net :: SMTP :: SSL (über Google Mail und Amazon smtp) - 'Verbindung geschlossen' beim Senden von E-Mails mit Anhang

Wenn jedoch die csv angebracht ist und die E-Mail schickte ich die folgende Fehlermeldung erhalten:

[Net::SMTP::SSL] Connection closed

ich nicht viel von dem Code hier setzen kann, aber ich kann zumindest zeigen Sie, was Teil des Codes meldet diesen Fehler. Ich frage mich, ob jemand hier weiß, warum das passiert, oder eine einfache Möglichkeit, es zu debuggen.

Hier ist der Codeblock für die E-Mail zu senden (mit Kommentaren zu dem Fehler gemeldet wird):

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; 

Bitte lassen Sie mich wissen, ob es eine andere Information ist erforderlich. Ich werde versuchen und bieten, was ich kann. Dies ist schwierig zu lösen, da der Fehler so zweideutig ist.

HINWEIS: Die E-Mails senden erfolgreich beim Entfernen des problematischen Anhangs und manchmal abhängig von der CSV-Inhalt senden.

+0

Bitte fügen Sie alle Details hinzu, um das Problem reproduzierbar zu machen. Wenn das Problem nur bei einem bestimmten E-Mail-Inhalt auftritt, müssen Sie diesen Inhalt zur Frage hinzufügen. Siehe [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –

+0

@SteffenUllrich Während ich wünschte, ich könnte den Inhalt des CSV hinzufügen, ist der Inhalt in Frage sensible Daten, die ich nicht bieten kann.Ich verstehe, dass dies nur komplizierter ist, aber ich fasse irgendwie nach Strohhalmen, wenn jemand Probleme mit bestimmten Inhalten hat, die zu zurückgewiesenen/geschlossenen SMTP-Verbindungen mit Google Mail führen. – jardis

+0

Sie müssen nicht den ursprünglichen (vertraulichen) Inhalt hinzufügen, der das Problem verursacht, aber nur einige (nicht sensible) Inhalte, die das Problem verursachen, sind ausreichend. Ich vermute, dass Sie mit Ihrem zugegebenermaßen merkwürdigen Problem keine Hilfe bekommen werden, wenn es keine Möglichkeit gibt, es zu reproduzieren. Stellen Sie außerdem sicher, dass Sie die neuesten Versionen von Net :: SMTP verwenden (das von Net :: SMTP :: SSL verwendet wird), falls bekannte, aber behobene Fehler vorliegen. –

Antwort

0

Net::SMTP unterstützt auch SSL. Möglicherweise möchten Sie es als Drop-In-Ersatz für Net :: SMTP :: SSL versuchen, aber ich bezweifle, dass es einen großen Unterschied machen würde.

Versuchen Sie, den Debug-Modus ermöglicht, um zu sehen, was passiert:

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

Sie sollten versuchen, um herauszufinden, ob das Problem auf E-Mails verbunden ist, ausgehend von einer bestimmten Größe (1k 8k?).

Gmail schließt nie nur eine Verbindung dazwischen, sie geben immer eine Fehlermeldung zurück, wenn die Verbindung durch intent geschlossen wurde.

+1

Ich werde versuchen, den Debug-Modus zu verwenden, sowie Net :: SMTP verwenden. Danke für die Alternative, die ich zu dir zurückbekomme, wenn das Dinge löst oder die Frage beantwortet, ob der Debugger etwas Licht darauf wirft. – jardis

1

Dies wird durch einen Fehler in Net :: Cmd verursacht wird, festgelegt in 3,08. Upgrade-Net :: Cmd auf 3,08 oder höher oder korrigieren Sie die Codezeile (um die Linie 530 und 573) durch Änderung:

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

zu

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

Diese Linie bewirkt, dass die Verbindung sofort zum Scheitern verurteilt, wenn es muss mehr als einen Chunk senden, obwohl der Code bereits mehr als einen Chunk korrekt verarbeitet. Daher, wenn Sie eine große Menge senden müssen, schlägt es fehl, wenn nicht (ohne die Anlage) ist es erfolgreich.

+0

Danke für diesen Einblick, ich muss bestätigen, dass dies der Fall ist, bevor ich deine Antwort akzeptiere, aber es klingt genau richtig. – jardis

+0

Es war für mich auf Ubuntu 16.04, die 3.05 hat. – stefanct