in reply to Net::SMTP halts script

According to the documentation, on failure new returns undef and $@ contains an appropriate error message. This seems to work as advertised for me:

19:50 >perl -MNet::SMTP -wE "my $smtp = Net::SMTP->new('invalid'); say + 'Next'; if (defined $smtp) { say 'SMTP defined' } else { say 'SMTP u +ndefined'; say $@; } say 'Still alive';" Next SMTP undefined Net::SMTP: Bad hostname 'invalid' Still alive 19:50 >p5u v Net::SMTP Net::SMTP C:\Perl\Strawberry\strawberry-perl-5.20.0.1-64bit-PDL\perl\lib +\Net\SMTP.pm: 2.33 19:50 >

Are you using an old version of the module? Are you sure it’s Net::SMTP->new() that’s causing the crash? Please give a minimal but self-contained script demonstrating the problem, together with the exact error message(s) that result.

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

Replies are listed 'Best First'.
Re^2: Net::SMTP halts script
by jellisii2 (Hermit) on Jul 23, 2014 at 11:23 UTC
    The version of perl you're using may come into play. If you're on a production machine and want to upgrade, I highly recommend Perlbrew.

    The more direct method of dealing with this is wrapping the call in an eval and checking the result in $@ afterward to see if you had success.

      Thanks. I will take a look.
Re^2: Net::SMTP halts script
by Anonymous Monk on Aug 18, 2014 at 14:00 UTC

    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;

      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