The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Mail::Sendmail v. 0.70 - sends mail... (would you believe it)

SYNOPSIS

  use Mail::Sendmail;

  %mail = ( To      => 'you@there.com',
            From    => 'me@here.com',
            Message => "Minimal message, with only To: and From: fields"
           );

  if (sendmail %mail) { print "Mail sent OK.\n" }
  else { print "Error sending mail: $Mail::Sendmail::error \n" }

  print STDERR "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;

DESCRIPTION

An easy platform independent way to send e-mail from any perl script.

After struggling for some time with various command-line mailing programs which didn't give me all the control I wanted, I found a nice script by Christian Mallwitz, put it into a module, and added a few features I wanted.

Mail::Sendmail contains mainly &sendmail, which takes a hash with the message to send and sends it...

sendmail is exported to your namespace.

INSTALLATION

- Copy Sendmail.pm to .../Perl/lib/Mail/ or .../Perl/lib/site/Mail/

- At the top of Sendmail.pm, set your Time Zone and your default SMTP server

- If you want to use MIME quoted-printable encoding, you need MIME::QuotedPrint from CPAN. It's in the MIME-Base64 package. To get it with your browser go to http://www.perl.com/CPAN//modules/by-module/MIME/

FEATURES

- Mime quoted printable encoding if requested (needs MIME::QuotedPrint)

- Bcc: and Cc: support

- Doesn't send unwanted headers

- Allows you to send any header you want

- Doesn't abort sending if there is a bad recipient address among other good ones

- Makes verbose error messages

- Adds the Date header if you don't supply your own

LIMITATIONS

Doesn't send attachments (you can still send them if you provide the appropriate headers and boundaries, but that may not be practical).

Only tested on Win95 and NT with MS Exchange server and CompuServe's server (whatever they use).

Not tested in a situation where the server goes down during session

USAGE DETAILS

sendmail

sendmail is the only thing exported to your namespace

sendmail(%mail) || print "Error sending mail: $Mail::Sendmail::error\n";

- takes a hash containing the full message, with keys for all headers, Body, and optionally for another non-default SMTP server. (The Body part can be called "Body", "Message" or "Text")

- returns 1 on success, 0 on error.

updates $Mail::Sendmail::error and $Mail::Sendmail::log.

Keys are not case-sensitive. They get normalized before use with ucfirst( lc $key )

The following are not exported, but you can still access them with their full name:

Mail::Sendmail::time_to_date()

convert time ( as from time() ) to a string suitable for the Date header as per RFC 822.

$Mail::Sendmail::VERSION

The package version number

$Mail::Sendmail::error

Fatal or non-fatal socket or SMTP server errors

$Mail::Sendmail::log

You can check it out after a sendmail to see what it says

$Mail::Sendmail::address_rx

A handy regex to recognize e-mail addresses

  Example:
    $rx = $Mail::Sendmail::address_rx;
    if (/$rx/) {
      $address=$1;
      $user=$2;
      $domain=$3;
    }
$Mail::Sendmail::default_smtp_server

see Configuration below

$Mail::Sendmail::default_smtp_port

see Configuration below

$Mail::Sendmail::TZ

Time Zone. see Configuration below

CONFIGURATION

At the top of Sendmail.pm, there are 2 variables you have to set:

- your Time Zone (until I change the module so it finds the TZ itself)

- your default SMTP server.

and the port number if your server doesn't use the default port 25 (which would be surprising, but who knows).

If you want a different server only for a particular script put $Mail::Sendmail::default_smtp_server = 'newserver.my-domain.com'; in your script.

If you want a different server only for a particular message, add it to your %message hash with a key of 'Smtp': $message{Smtp} = 'newserver.my-domain.com';

ANOTHER EXAMPLE

  use Mail::Sendmail;

  print STDERR "Testing Mail::Sendmail version $Mail::Sendmail::VERSION\n";
  print STDERR "smtp server: $Mail::Sendmail::default_smtp_server\n";
  print STDERR "server port: $Mail::Sendmail::default_smtp_port\n";

  %mail = (
      #To      => 'No to field this time, only Bcc and Cc',
      From    => 'Myself <me@here.com>',
      Bcc     => 'Someone <him@there.com>, Someone else her@there.com',
      # only addresses are extracted from Bcc, real names disregarded
      Cc      => 'Yet someone else <xz@whatever.com>',
      # Cc will appear in the header. (Bcc will not)
      Subject => 'Test message',
      'Content-transfer-encoding' => 'quoted-printable',
      'X-Mailer' => "Mail::Sendmail",
  );

  $mail{Smtp} = 'special_server.for-this-message-only.domain.com';
  $mail{'X-custom'} = 'My custom additionnal header';
  $mail{message} = "Only a short message";
  $mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 ), # cheat on the date

  if (sendmail %mail) { print "Mail sent OK.\n" }
  else { print "Error sending mail: $Mail::Sendmail::error \n" }

  print STDERR "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;

AUTHOR

Milivoj Ivkovic mi@alma.ch or ivkovic@csi.com

NOTES

You can use this freely.

I would appreciate a short (or long) e-mail note if you do. And of course, bug-reports and/or improvements are welcome.

Last revision: 18.06.98. Latest version should be available at http://alma.ch/perl/mail.htm