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

Hi Monks. This is more of a continuation from a previous post.

I have a script that has been sending mail using Net::SMTP for a while now quite successfully. I recently was asked by my supervisor to add the ability to authenticate in that email script.

Khen1950fx posted a short script to use Authen::SASL more directly, instead of SMTP_auth as I can't ask multiple ISP's for our customers to install SMTP_auth. So here is my results from the server with the debug option on, and afterwards the modified version of his code suggestion. I get an error, hopefully someone can help me with it, Khen1950fx or anyone else.

SMTP authNet::SMTP>>> Net::SMTP(2.29) Net::SMTP>>> Net::Cmd(2.26) Net: +:SMTP>>> Exporter(5.58) Net::SMTP>>> IO::Socket::INET(1.29) Net::SMTP +>>> IO::Socket(1.29) Net::SMTP>>> IO::Handle(1.25) Net::SMTP=GLOB(0x2 +a152d4)<<< 220 vinyl4.sentex.ca ESMTP Sendmail 8.14.5/8.14.5; Mon, 2 +Jul 2012 14:48:57 -0400 (EDT) Net::SMTP=GLOB(0x2a152d4)>>> EHLO local +host.localdomain Net::SMTP=GLOB(0x2a152d4)<<< 250-vinyl4.sentex.ca He +llo 50-56-96-131.static.cloud-ips.com [50.56.96.131], pleased to meet + you Net::SMTP=GLOB(0x2a152d4)<<< 250-ENHANCEDSTATUSCODES Net::SMTP=G +LOB(0x2a152d4)<<< 250-PIPELINING Net::SMTP=GLOB(0x2a152d4)<<< 250-8BI +TMIME Net::SMTP=GLOB(0x2a152d4)<<< 250-SIZE 30000000 Net::SMTP=GLOB(0 +x2a152d4)<<< 250-DSN Net::SMTP=GLOB(0x2a152d4)<<< 250-ETRN Net::SMTP= +GLOB(0x2a152d4)<<< 250-AUTH PLAIN LOGIN DIGEST-MD5 Net::SMTP=GLOB(0x2 +a152d4)<<< 250-STARTTLS Net::SMTP=GLOB(0x2a152d4)<<< 250-DELIVERBY Ne +t::SMTP=GLOB(0x2a152d4)<<< 250 HELP starting auth sending from [michael@thewhitings.ca] to [michael@thewhitings.ca]Net:: +SMTP=GLOB(0x2a152d4)>>> MAIL FROM: Net::SMTP=GLOB(0x2a152d4)<<< 250 2 +.1.0 ... Sender ok Net::SMTP=GLOB(0x2a152d4)>>> RCPT TO: Net::SMTP=GL +OB(0x2a152d4)<<< 550 5.7.1 ... Relaying denied. Proper authentication + required. Net::SMTP=GLOB(0x29dbba4)>>> DATA Net::SMTP=GLOB(0x29dbba4 +)<<< 503 5.0.0 Need RCPT (recipient) datasendNet::SMTP=GLOB(0x29dbba4)>>> test text Your Items Have Been Requested, Thank You
You can see the Relaying denied. Proper authentication required. error in there. It seems to be getting past the 'die' statement when running the &auth subroutine, and then choking when it tries to send data. Here is my code currently:
sub main { use Net::SMTP; $SMTPServer = 'localhost' unless (defined $SMTPServer); BEGIN { $| = 1; require MIME::Base64; require Authen::SASL; } my $host = $SMTPServer; my $user = $mainlogin; my $pass = $mainpwd; my $NetSMTP = Net::SMTP->new( Host => $host, Time => 30, Debug => 1, ); my $sasl; my $mechanisms = ['AUTH', 500]; print "starting auth<br>"; die "Couldn't auth sasl login: $!" unless \&auth; $NetSMTP->mail($emailFrom); $NetSMTP->to($LibDef{$LibName}[1]); $NetSMTP->data(); $NetSMTP->datasend('test text'); close (MAIL); print "<br><br><b>$REQUESTPAGE_TEXT_THANKYOU</b>"; } sub auth { my $sasl = Authen::SASL->new( mechanism => $mechanisms, debug => 1, callback => { user => $user, pass => $pass, authname => $user, ); }

Replies are listed 'Best First'.
Re: Authen::SASL error
by Anonymous Monk on Jul 03, 2012 at 20:25 UTC

    Where did all the newlines go?

    The stuff you pasted seems very disconnected from itself and unlike anything I see in the documentation -- typical Khen1950fx junk -- sorry about that, I usually try to point-out his nonsense, but I shy away from email threads

    What you want to try is delete all SASL stuff from you code and add only this

    $NetSMTP->auth( $user, $pass );
    and Net::SMTP will try to load Authen::SASL... if the remote server demands it... and it should just work.

    Through UTSLing I learned you can also write  $NetSMTP->auth( Authen::SASL->new(...) ); if you need more customization

    If it doesn't, well, you'll need to copy Net::SMTP_auth exactly

    as I can't ask multiple ISP's for our customers to install SMTP_auth.

    See also Yes, even you can use CPAN, Top 11 (GOOD) reasons not to use someone else's Modules, Top Seven (Bad) Reasons Not To Use Modules

      OK, so I tried that. I think I did try it once before too and I still get the same result now as I did back then (without all the other output):

      Cannot find a SASL Connection library at PERL2EXE_STORAGE/Net/SMTP.pm line 137

      Note that I am using a program to compile my perl code into an exe to run on Windows (called Perl2exe), so I have to explicitly tell it to include things sometimes. I already have included Authen/SASL.pm with it, but it still seems to be missing something.

        Cannot find a SASL Connection library at PERL2EXE_STORAGE/Net/SMTP.pm line 137

        Kind of important detail, eh? :)

        First things first, does it work outside of perl2exe?

        I already have included Authen/SASL.pm with it, but it still seems to be missing something.

        You probably need to add more, like all installed Authen::SASL::* modules and their deps .... I don't use perl2exe so i don't know how smart it is, but scandeps -x file.pl can help you generate a fairly complete list for perl2exe

        I prefer PAR or http://www.cavapackager.com/ even though cava website is half-there ATM )

      Anonymous Monk - I installed the Scandeps module on my local machine to try this out but I don't seem to get any output. My little program is this:

      use Module::ScanDeps; my $hash_ref = scan_deps(files => [ 'c:\libsearch-work.cgi' ], recurse => 1, ); print "start:"; while (($key, $value) = each(%{$hash_ref})) { print $key.", ".$value."<br />"; }

      But I get no output (other that the 'start:', just to tell me it's there.) Am I missing something in how to operate this ScanDeps machine? Thanks - I appreciate your help in this .... muchly :)

      (I also find that I can't post replies to the most recent reply on this thread, so I did it here.)