Chapter 46. Sending Mail Without sendmail
Sooner or later, most Perl programmers need to send electronic mail from a program. It might be for a CGI application, sending out autoconfirmations, generating monthly email invoices, or sending reports to the payroll department.
The normal way to send email from Perl is to use the Mail::Sendmail module, or to do something like this:
open (SENDMAIL, "|/usr/lib/sendmail -t") or die "Can't start sendmail"; print SENDMAIL "From: (goes here)\n"; print SENDMAIL "To: (goes here)\n"; print SENDMAIL "Subject: Test mail\n\n"; print SENDMAIL "Message body goes here"; close SENDMAIL or die "Hey, sendmail failed!";
Nice, simple, and straightforward—but not if you’re on a non-Unix machine (such as Windows, VMS, OS/390, or the Mac) or you don’t have
sendmail or a reasonable fascimile installed. And even if you do have
sendmail, you might not want to pay the cost to invoke it just to send a single mail message. It is, after all, a fairly big program, and the last thing you want is your system monitoring program to drop dead because it couldn’t fork off
sendmail to tell you it was out of process slots.
In this article, I’m going to build a
sendmail replacement suitable both for use in place of a real
sendmail and as donor code that you will undoubtedly gut for your own use. (I use the mail-sending routines in some system monitoring programs, for example.)
Some Email Background
Before I go into the code that actually sends the mail, I need to talk ...