MIME::Lite->send()
to send an email, which until recently was using an SMTP server slated for decommissioning Real Soon Now. It was my job to convert it to Amazon SES, and I figured it would be easier to tell MIME::Lite to use SES's SMTP interface instead of importing the web side's full Perl library tree just for one module out of it.Ha ha! SES requires SSL, and neither MIME::Lite nor Net::SMTP have any idea about that. They were both written before the days of dependency injection, so I had to go to some length to achieve it. And now, I golfed it a bit for you:
package MyApp::Monkey::SMTPS; use warnings; use strict; use parent 'IO::Socket::SSL'; # Substitute us for the vanilla INET socket require Net::SMTP; @Net::SMTP::ISA = map { s/IO::Socket::INET/MyApp::Monkey::SMTPS/; $_ } @Net::SMTP::ISA; our %INET_OPTS = qw( PeerPort smtps(465) SSL_version TLSv1 ); # and more options, probably # Override new() to provide SSL etc. parameters sub new { my ($cls, %opts) = @_; $opts{$_} = $INET_OPTS{$_} foreach keys %INET_OPTS; $cls->SUPER::new(%opts); }PeerPort overrides the default of
smtp(25)
built in to Net::SMTP; I needed a port where the whole connection is wrapped in SSL instead of using STARTTLS, and 465 is the one suitable choice of the three that SES-SMTP supports.The main caveat about this is that it breaks Net::SMTP for anyone else in-process who wants to send mail to a server that lacks a functional port 465. But as you may have guessed, that's not a problem for my script, today.
No comments:
Post a Comment