noisey has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I'm having some trouble with Net::SMTP when used in a for loop.
The first iteration works, but on the second iteration the script dies with Can't call method "mail" on an undefined value at..., the line referred to being $smtp->mail('hacker@hacker.net'); #from.
Any ideas?! Thanks for your time!


use strict; use warnings; use Net::SMTP; my $smtp; #@data is defined and populated somewhere foreach my $line (@data) { my @linearray=split(/,/,$line); my $host=$linearray[2]; $host =~ s/\r|\n//g; next unless ($host =~ m/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}).([0- +9]{1,3})/); # skip if it's not an IP (i.e. it's the header row) print "Connecting to $host..."; # create object $smtp = Net::SMTP->new( Hello => 'hacker.net', Timeout => 3, Host => $host, Debug => 1, ); $smtp->mail('hacker@hacker.net'); #from my $tocheck=$smtp->recipient('my_email@sanitised.com'); #to if ($tocheck==0) { #check if it doesn't like that 'to' address print "$host is NOT an open relay\n"; #$smtp->quit; next; } $smtp->data(); $smtp->datasend("Test\n"); $smtp->datasend("\n"); $smtp->datasend("A simple test message\n"); $smtp->dataend(); $smtp->quit; }

RESOLVED: Resolved. Tail slightly between the legs on this one. It turns out that the list of IPs given to me had already been contacted about the issue and therefore some has started putting measures in place to fix the problem. One such measure was blocking TCP port 25 with a source IP different to a trusted relay (not my IP just to clarify). Therefore creation of the Net::SMTP was simply failing. So reintroduction of the block to test creation of the object (which I'd removed while trying to debug this issue) fixed it all up. Thanks for your help guys - much appreciated.

Replies are listed 'Best First'.
Re: Net::SMTP undef weirdness
by Anonymous Monk on Aug 23, 2012 at 09:42 UTC
      Yes it is - I will update both. I wanted to cast the net wider than just this forum.
Re: Net::SMTP undef weirdness
by Anonymous Monk on Aug 23, 2012 at 08:46 UTC

    Any ideas?!

    Its very simple, every function/method call can either succeed or fail -- don't assume they always succeed , check to see if they failed, or trap any failures

    A reply falls below the community's threshold of quality. You may see it by logging in.
Re: Net::SMTP undef weirdness
by Anonymous Monk on Aug 23, 2012 at 08:43 UTC
    Why are you looking for "open relays"?
      Because some of our clients are inadvertently running them and our WAN is getting targeted by spammers as a result.