Ein Skript, welches MIME::Lite zum Versenden von Mails verwendet, hat sich im Fehlerfall lieber direkt mit einem “SMTP Failed to connect to mail server: Bad file descriptor” beendet, statt gemäß Dokumentation auf den Fehler zu reagieren.
use strict;
use warnings;
use MIME::Lite;
MIME::Lite->send('smtp', 'mailserver', Debug => 0);
my $msg = MIME::Lite->new(
From => 'me@whereever.net',
To => 'you@somewhereelse.net',
Data => 'Hello World!',
Subject => 'testmail',
);
$msg->send || die "you DON'T have mail!";
print "... still running ...";
Weder “you DON’T have mail!” noch “… still running …” werden ausgegeben, da diese Stellen im Code auf Grund des Programmabbruchs nicht mehr erreicht werden.
Leider ist die Erläuterung zum Verhalten der Funktion “$msg->send” nicht wirklich hilfreich:
Returns whatever the mail-handling routine returns: this should be true on success, false/exception on error.
Eine Suche im Internet führte zum Blogbeitrag “Perl exception handling”, welcher genau das aufgetretene Verhalten beschreibt und eine Lösungsmöglichkeit mittels “eval” aufzeigt:
use strict;
use warnings;
use MIME::Lite;
MIME::Lite->send('smtp', 'mailserver', Debug => 0);
my $msg = MIME::Lite->new(
From => 'me@whereever.net',
To => 'you@somewhereelse.net',
Data => 'Hello World!',
Subject => 'testmail',
);
eval { $msg->send; };
if ($@) {
print "you DON'T have mail!";
}
print "... still running ...";
So gekapselt läuft das Skript auch nach einem gescheiterten “$msg->send” weiter und auf einen eventuellen Fehler kann reagiert werden.