Just to confirm the suggested solution works. Today, just at the time the internet connection went down, my script logged the expiry of a 20 second timeout sending a simple message but carried on running.

Of course it's easy for me because I know what sort of messages I will be sending and can thus set appropriate timeouts. As a general solution the calculation of the appropriate timeout becomes more complicated.

In case it is of interest to anyone I have put my modified code below.

sub sendmail { my ($arg_ref) = @_; print "Running sendmail()\n" if ($onterm && ($debug & $DEBUG_NOTIFY_ +MAILS)); =pod This subroutine is the interface to the mail sender functionality. Depending on incoming parameters it sends just a message or a message + with attachment If the attachment file does not exist it sends message with notificat +ion that file was not found =cut my $sendfailed = 0; my $sender = new Mail::Sender( {from => $arg_ref->{from}, smtp => $arg_ref->{smtp}, port => $arg_ref->{port}, auth => $arg_ref->{auth}, authid => $arg_ref->{authid}, authpwd => $arg_ref->{authpwd}, auth_encoded => $arg_ref->{auth_encoded}, encoding => 'Quoted-printable', charset => $charset, }); if ($sender > 0) { print "\$sender created OK\n" if ($onterm && ($debug & $DEBUG_NOTI +FY_MAILS)); if ((defined $arg_ref->{file}) && (-f $arg_ref->{file})) { # Sen +d message with attachment if the attached file exists print "sending mail with attachment\n" if ($onterm && ($debug & +$DEBUG_NOTIFY_MAILS)); my $mailfiletimeout = 120; #120 seconds eval { local $SIG{ALRM} = sub { die "MailFile Timeout\n" }; # NB: \n requ +ired alarm $mailfiletimeout; $sender->MailFile({to => $arg_ref->{to}, subject => $arg_ref->{subject}, encoding => "Base64", ## read this from parameters? msg => encode($charset,$arg_ref->{msg}), file => $arg_ref->{file} }); alarm 0; }; if ($@) { die unless $@ eq "MailFile Timeout\n"; # propagate unexpected erro +rs logerror("Timeout ($mailfiletimeout seconds) sending $arg_ref->{fi +le} to $arg_ref->{to} via $arg_ref->{smtp}"); return 0; } else { if (defined $sender->{'error'} ){ logerror( "Error sending mail with attachment '$arg_ref->{file}' + to $arg_ref->{to}: Error code $sender->{'error'} ($sender->{'error_m +sg'})"); $sendfailed = 1; } else { loginfo("File \"$arg_ref->{file}\" successfully emailed to $arg_ +ref->{to}"); } } } else { #send a message with no attachment #Should never receive a filename for a file that does not exist. + Add a line to the message if it ever happens $arg_ref->{msg} .= "\n\nAttempt to send file '$arg_ref->{file}' + abandoned: File does not exist" if defined $arg_ref->{file}; print "sending mail without attachment\n" if ($onterm && ($debug + & $DEBUG_NOTIFY_MAILS)); my $mailmessagetimeout = 20; #20 seconds eval { local $SIG{ALRM} = sub { die "MailMsg Timeout\n" }; # NB: \n requi +red alarm $mailmessagetimeout; $sender->MailMsg({to => $arg_ref->{to}, subject => $arg_ref->{subject}, encoding => "Quoted-printable", ## read this from parame +ters? msg => encode($charset,$arg_ref->{msg}), }); alarm 0; }; if ($@) { die unless $@ eq "MailMsg Timeout\n"; # propagate unexpected error +s logerror("Timeout ($mailmessagetimeout seconds) sending message to + $arg_ref->{to} via $arg_ref->{smtp}"); return 0; } else { if (defined $sender->{'error'} ){ logerror( "Error sending mail to $arg_ref->{to}: Error code $sen +der->{'error'} ($sender->{'error_msg'})"); $sendfailed = 1; } else { print "Mail sent to $arg_ref->{to}\n" if ($onterm && ($debug & + $DEBUG_NOTIFY_MAILS)); } } } # send a message with no attachment } # if ($sender > 0) else { logerror("Could not establish mail sender to $arg_ref->{to}: Error + code $sender ($Mail::Sender::Error)"); $sendfailed = 1; } print "Leaving sendmail (\$sendfailed = $sendfailed)\n" if ($onterm + && ($debug & $DEBUG_NOTIFY_MAILS)); return ($sendfailed) ? 0 : 1; }

In reply to Re^4: Race condition with Mail::Sender::MailMsg? by DrewP
in thread Race condition with Mail::Sender::MailMsg? by DrewP

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.