2009-10-02 I hate the Perl SMTP libraries
At home I have Net::SMTP::TLS and Net::SMTP::SSL installed and I’ve managed to use both to send mail via my Google account.
On one of my hosting services, I have only Net::SMTP::SSL, and it just won’t work.
Debug output at home:
Net::SMTP::SSL>>> Net::SMTP::SSL(1.01) Net::SMTP::SSL>>> IO::Socket::SSL(1.24) Net::SMTP::SSL>>> IO::Socket::INET(1.31) Net::SMTP::SSL>>> IO::Socket(1.31) Net::SMTP::SSL>>> IO::Handle(1.28) Net::SMTP::SSL>>> Exporter(5.58) Net::SMTP::SSL>>> Net::Cmd(2.29) Net::SMTP::SSL=GLOB(0x186fc04)<<< 220 mx.google.com ESMTP 24sm915314eyx.9 Net::SMTP::SSL=GLOB(0x186fc04)>>> EHLO localhost.localdomain Net::SMTP::SSL=GLOB(0x186fc04)<<< 250-mx.google.com at your service, [80.219.173.68] Net::SMTP::SSL=GLOB(0x186fc04)<<< 250-SIZE 35651584 Net::SMTP::SSL=GLOB(0x186fc04)<<< 250-8BITMIME Net::SMTP::SSL=GLOB(0x186fc04)<<< 250-AUTH LOGIN PLAIN Net::SMTP::SSL=GLOB(0x186fc04)<<< 250-ENHANCEDSTATUSCODES Net::SMTP::SSL=GLOB(0x186fc04)<<< 250 PIPELINING Net::SMTP::SSL=GLOB(0x186fc04)>>> AUTH LOGIN Net::SMTP::SSL=GLOB(0x186fc04)<<< 334 VXNlcm5hbWU6 Net::SMTP::SSL=GLOB(0x186fc04)>>> a2Vuc2FuYXRh Net::SMTP::SSL=GLOB(0x186fc04)<<< 334 UGFzc3dvcmQ6 Net::SMTP::SSL=GLOB(0x186fc04)>>> VGgsYmFpZA== Net::SMTP::SSL=GLOB(0x186fc04)<<< 235 2.7.0 Accepted Net::SMTP::SSL=GLOB(0x186fc04)>>> MAIL FROM:<kensanata@gmail.com>
Notice the AUTH LOGIN command.
Debug output on my host:
Net::SMTP::SSL>>> Net::SMTP::SSL(1.01) Net::SMTP::SSL>>> IO::Socket::SSL(1.16) Net::SMTP::SSL>>> IO::Socket::INET(1.31) Net::SMTP::SSL>>> IO::Socket(1.30_01) Net::SMTP::SSL>>> IO::Handle(1.27) Net::SMTP::SSL>>> Exporter(5.62) Net::SMTP::SSL>>> Net::Cmd(2.29) Net::SMTP::SSL=GLOB(0xa025520)<<< 220 mx.google.com ESMTP 10sm135225eyz.42 Net::SMTP::SSL=GLOB(0xa025520)>>> EHLO localhost.localdomain Net::SMTP::SSL=GLOB(0xa025520)<<< 250-mx.google.com at your service, [83.137.100.36] Net::SMTP::SSL=GLOB(0xa025520)<<< 250-SIZE 35651584 Net::SMTP::SSL=GLOB(0xa025520)<<< 250-8BITMIME Net::SMTP::SSL=GLOB(0xa025520)<<< 250-AUTH LOGIN PLAIN Net::SMTP::SSL=GLOB(0xa025520)<<< 250-ENHANCEDSTATUSCODES Net::SMTP::SSL=GLOB(0xa025520)<<< 250 PIPELINING Net::SMTP::SSL=GLOB(0xa025520)>>> MAIL FROM:<kensanata@gmail.com> Net::SMTP::SSL=GLOB(0xa025520)<<< 530-5.5.1 Authentication Required. Learn more at Net::SMTP::SSL=GLOB(0xa025520)<<< 530 5.5.1 http://mail.google.com/support/bin/answer.py?answer=14257 10sm135225eyz.42
Notice the error: Authentication Required.
Why is the same script (I checked twice – I sure hope I’m not confusing anything) not using the AUTH LOGIN command?
I don’t understand.
my $mail = new MIME::Entity->build(To => $from, # test! From => $from, Subject => 'Test Net::SMTP::SSL', Path => $fh, Type => "text/html"); my $smtp = Net::SMTP::SSL->new($host, Port => 465, Debug => 1); $smtp->auth($user, $password); $smtp->mail($from); $smtp->to($from); # test! $smtp->data; $smtp->datasend($mail->stringify); $smtp->dataend; $smtp->quit;
Source is available. [1]
Output of perl -MNet::SMTP::SSL -wle 'for (keys %INC) { next
if m[^/]; $m = $_; $m =~ s[/][::]g; $m =~ s/\.pm$//; print "$m ",
$m->VERSION || "<unknown>" }' as suggested on #perl:
| At home | Remote system |
|---|---|
Net::SSLeay 1.35 IO::Handle 1.28 List::Util 1.14 SelectSaver 1.00 IO::Socket 1.31 warnings 1.03 Symbol 1.05 Scalar::Util 1.14 IO::Socket::INET 1.31 Exporter 5.58 Errno 1.09 IO::Socket::SSL 1.24 warnings::register 1.00 XSLoader 0.02 Net::Config 1.11 Net::Cmd 2.29 utf8 1.04 Config <unknown> IO 1.25 IO::Socket::UNIX 1.23 Carp 1.03 bytes 1.01 Exporter::Heavy 5.58 Net::SMTP 2.31 vars 1.01 strict 1.03 Net::SMTP::SSL 1.01 constant 1.04 Socket 1.77 AutoLoader 5.60 DynaLoader 1.05 | Net::SSLeay 1.35 XSLoader 0.08 IO::Handle 1.27 warnings::register 1.01 Net::Config 1.11 List::Util 1.19 SelectSaver 1.01 Net::Cmd 2.29 IO::Socket 1.30_01 warnings 1.06 utf8 1.07 IO::Socket::UNIX 1.23 IO 1.23_01 Symbol 1.06 bytes 1.03 Carp 1.08 Net::SMTP 2.31 Scalar::Util 1.19 Exporter::Heavy 5.62 IO::Socket::INET 1.31 Net::SMTP::SSL 1.01 strict 1.04 vars 1.01 Exporter 5.62 constant 1.13 Socket 1.80 Errno 1.1 IO::Socket::SSL 1.16 AutoLoader 5.63 |
Hm…
Update: I found the problem and submitted a bug: The remote system is a Debian system, and the admin installed libnet-smtp-ssl-perl. If you look at the Net::SMTP code, however, you’ll see the following:
sub auth {
my ($self, $username, $password) = @_;
eval {
require MIME::Base64;
require Authen::SASL;
} or $self->set_status(500, ["Need MIME::Base64 and Authen::SASL
todo auth"]), return 0;There is therefore a dependency on Authen::SASL. If you don’t have that module, sending your email will fail in a non-obvious way, as seen above. Installing libauthen-sasl-perl fixes the problem.
2009-06-06 Spam Makes Sending Mail Harder
Here I am trying to send mail using some Perl module. But most of them seem to be written for the last millenium. They work best with a local SMTP host. For my own needs, that no longer works. The webhost doesn’t have a sendmail binary available. The SMTP hosts I can reach require SSL and TLS authentication. Now I’m slowly digging into MIME::Entity, Mail::Internet, Mail::Mailer, Net::SMTP, Net::SMTP::SSL, Net::SMTP::TLS…

After experimenting with the four or five mail accounts I have access to, I was finally able to get the following to work:
my $from = 'kensanata@gmail.com'; my $to = $from; my $host = 'mail.epfarms.org'; my $user = 'alex'; my $password = '*secret*'; use MIME::Entity; my $mail = new MIME::Entity->build(To => $to, From => $from, Subject => 'test', Path => '/Users/alex/test.html', Type => 'text/html'); use Net::SMTP::TLS; my $smtp = Net::SMTP::TLS->new($host, User => $user, Password => $password, Debug => 1); $smtp->mail($from); # sender $smtp->to($to); # recipient $smtp->data; $smtp->datasend($mail->stringify); $smtp->dataend; $smtp->quit;
Comments on 2009-06-06 Spam Makes Sending Mail Harder
Well, theoretically at least it should now be possible to subscribe to comment pages!
– AlexSchroeder 2009-06-06 16:43 UTC
Guess not, because the webhost doesn’t have Net::SMTP::TLS installed. 
– AlexSchroeder 2009-06-06 16:58 UTC
I think it works after all! Luckily I wrote my script such that it gets the page content and subscriber list via ordinary HTTP requests, so the cron job that sends out emails can run anywhere on the net. This one is running on a server hosted by Eggplant Farms.
– AlexSchroeder 2009-06-07 13:25 UTC


Thanks for the heads up on the Authen::SASL dependency…been working on it for hours and getting nowhere.
– Fred 2009-12-09 18:34 UTC
I’m not sure what to make of the response given to the bug report. Does Gregor agree with me or not? It’s weird.
– AlexSchroeder 2009-12-09 23:24 UTC
Add Comment