in reply to Re: Net::SMTP halts script
in thread Net::SMTP halts script

Using Fedora Core 20. Perl v5.18.2. Compiled Jan 14.

When I say "crash", I simply mean it halts the program to sent the email giving the error

"Mon Aug 18 14:44:47 2014 bb.cgi: Can't call method "mail" on an undefined value at bb.cgi line 85."

Even though my $INVALID is defined as "duffhost.duffhost.com".

If I add anything after this code , it does not run.

If I replace $INVALID with $GATEWAY (a real address) it works fine.

If you put two together, the working one first, it runs, sends the first email and then halts.If you put two together, the working one last, it halts.

---------

$smtp = Net::SMTP->new("$INVALID", Debug => 3 );

$smtp->mail("$FROM");

$smtp->to("$EMAIL");

$smtp->cc("$USEREMAIL");

$smtp->data();

$smtp->datasend("From: $FROM \n");

$smtp->datasend("To: $EMAIL \n");

$smtp->datasend("Cc: $USEREMAIL\n");

$smtp->datasend("Subject: $SUBJECT \n");

$smtp->datasend("\n");

$smtp->datasend("$MAILTEXT \n");

$smtp->datasend("\n");

$smtp->dataend();

$smtp->quit;

Replies are listed 'Best First'.
Re^3: Net::SMTP halts script
by Athanasius (Archbishop) on Aug 19, 2014 at 03:13 UTC

    As I showed above, Net::SMTP->new() returns undef on failure. If you then try to call a method on this undef value, you effectively have undef->mail($FROM);of course this method call will die! You need an explicit test for undef, to ensure that the mail(), to(), cc(), etc., methods are only ever called on defined objects. For example (untested):

    my $smtp = Net::SMTP->new($INVALID, Debug => 3); if (defined $smtp) { $smtp->mail($FROM); $smtp->to($EMAIL); $smtp->cc($USEREMAIL); $smtp->data(); $smtp->datasend("From: $FROM \n"); $smtp->datasend("To: $EMAIL \n"); $smtp->datasend("Cc: $USEREMAIL\n"); $smtp->datasend("Subject: $SUBJECT \n"); $smtp->datasend("\n"); $smtp->datasend("$MAILTEXT \n"); $smtp->datasend("\n"); $smtp->dataend(); $smtp->quit; } else { print $@, "\n"; }

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Athanasius,

      That's the one I needed. Thanks for spelling it out for me.

      I can now add a "catch" line to warn when the connection is down.

      Cheers