Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

flexible command line mail sender (SMTP)

by holli (Abbot)
on Jun 23, 2005 at 07:44 UTC ( [id://469311]=sourcecode: print w/replies, xml ) Need Help??
Category: E-Mail Programs
Author/Contact Info holli
Description: A Simple tool to send mails from the command line via a smptp server.
# 
# EDVMAIL 0.2
#
use warnings;
use strict;

use Mail::Sender;
use File::Slurp;

use Getopt::Attribute;
use Getopt::ArgvFile;

our $to          : Getopt(an=s);
our $from        : Getopt(absender=s EDV);
our $subject     : Getopt(betreff=s);
our $password    : Getopt(passwort=s xxxx);
our $mode        : Getopt(modus=s html);

our @cc          : Getopt(cc=s);
our @mailfiles   : Getopt(dateien=s);
our @attachments : Getopt(attachments=s);
our @lines       : Getopt(zeilen=s);

die "Kein Adressat angegeben!\n"   . usage()
    unless defined $to;

die "Kein Betreff angegeben!\n"    . usage()
    unless defined $subject;

die "Keine Nachricht angegeben!\n" . usage()
    unless (@mailfiles or @lines);

my ($br, $ctype);

if ( $mode =~ /html/i )
{
    $br    = "<br>";
    $ctype = "text/html";
}
else
{
    $br    = "";
    $ctype = "text/plain";
}    

my $sender = new Mail::Sender 
{

    smtp    => '192.168.1.23', 
    from    => "$from\@kvsaarland.de",
    authid  => $from,
    authpwd => $password,
}
or die "Mail::Sender Objekt kann nicht erstellt werden: $Mail::Sender:
+:Error\n";

$sender->OpenMultipart
({
    to => $to, 
    subject => $subject, 
    cc => [@cc],
    boundary => ""
});

$sender->Body({ encoding => 'ISO-8859-1', ctype=>$ctype });

$sender->Send('<font face="Arial" size="2">')
    if $br;

if ( @lines )
{
    $sender->Send ( map { chomp; "$_$br\n" } @lines )
        or die "$Mail::Sender::Error\n";
}

if ( @mailfiles )
{
    $sender->Send ( map { map { chomp; "$_$br\n" } read_file ($_) } @m
+ailfiles )
        or die "$Mail::Sender::Error\n";
}

$sender->Send('</font>')
    if $br;

if ( @attachments )
{
    $sender->Send   ( "$br\n" x 2 ),
    $sender->Attach ( { file => $_ } ) 
        for @attachments;
}

$sender->Close()
    or die "Nachricht kann nicht gesendet werden: $sender->{'error_msg
+'}\n";

print "Nachricht versendet.\n";
    
sub usage
{
    return <<'USAGE';
edvmail.pl - 0.2

Aufruf:
 edvmail -parameter [wert]

Parameter:
 -ab(sender)      opt. Absender (ohne "@kvsaarland.de", default: EDV)
 -an              erf. Empf„nger
 -cc            * opt. Blindkopie
 -b(betreff)      erf. Betreff
 -p(asswort)      opt. Passwort, default "xxxx"
 -d(atei)       * opt. Textdateien fr den Text der Mail
 -at(tachments) * opt. Anh„nge
 -z(eilen)      * opt. Textzeilen
 -m(odus)         opt. "text" or "html", default "html"

Mit * gekennzeichnete Parameter können mehrfach angegeben werden.

Beispiel:
 edvmail -ab m.holzer -an p.balfie@kvsaarland.de -cc m.taller@kvsaarla
+nd.de 
         -b "Na ihr Luschen?" -z "Was Lustiges" -z "im Anhang" -at c:\
+witze.txt
USAGE
}
Replies are listed 'Best First'.
Re: flexible command line mail sender (SMTP)
by davidrw (Prior) on Jun 23, 2005 at 11:33 UTC
    Looks handy (and a good sample for including in other programs the next time i need to kick off emails, especially with attachments).

    One quick request though -- can you post (or make a usage_en() sub or in __END__ or in =pod) an english translation of the USAGE heredoc? thanks!
      Here's your english version:
      # # EDVMAIL 0.2 # use warnings; use strict; use Mail::Sender; use File::Slurp; use Getopt::Attribute; use Getopt::ArgvFile; our $to : Getopt(to=s); our $from : Getopt(from=s EDV); our $subject : Getopt(subject=s); our $password : Getopt(password=s xxxx); our $mode : Getopt(mode=s html); our @cc : Getopt(cc=s); our @mailfiles : Getopt(files=s); our @attachments : Getopt(attachments=s); our @lines : Getopt(lines=s); die "No recipient specified!\n" . usage() unless defined $to; die "No subject specified!\n" . usage() unless defined $subject; die "No message specified!\n" . usage() unless (@mailfiles or @lines); my ($br, $ctype); if ( $mode =~ /html/i ) { $br = "<br>"; $ctype = "text/html"; } else { $br = ""; $ctype = "text/plain"; } my $sender = new Mail::Sender { smtp => '192.168.1.23', from => "$from\@kvsaarland.de", authid => $from, authpwd => $password, } or die "Cannot create Mail::Sender Object: $Mail::Sender::Error\n"; $sender->OpenMultipart ({ to => $to, subject => $subject, cc => [@cc], boundary => "" }); $sender->Body({ encoding => 'ISO-8859-1', ctype=>$ctype }); $sender->Send('<font face="Arial" size="2pt">') if $br; if ( @lines ) { $sender->Send ( map { chomp; "$_$br\n" } @lines ) or die "$Mail::Sender::Error\n"; } if ( @mailfiles ) { $sender->Send ( map { map { chomp; "$_$br\n" } read_file ($_) } @m +ailfiles ) or die "$Mail::Sender::Error\n"; } $sender->Send('</font>') if $br; if ( @attachments ) { $sender->Send ( "$br\n" x 2 ), $sender->Attach ( { file => $_ } ) for @attachments; } $sender->Close() or die "Message not sent: $sender->{'error_msg'}\n"; print "Message sent.\n"; sub usage { return <<'USAGE'; edvmail.pl - 0.2 Usage: edvmail -parameter [wert] Parameter: -fr(om) opt. Author (without "@domain", default: EDV) -to req. Recipient -cc * opt. CC-Adresses -s(ubject) req. subject -p(assword) opt. Password, default "xxxx" -fi(les) * opt. Textfiles that build the text for the Mail -a(ttachments) * opt. Well, attachments. -l(ines) * opt. Text of the mail -m(ode) opt. "text" or "html", default "html" Parameters with * can me specified multiple times. Example: edvmail -fr m.holzer -to p.balfie@kvsaarland.de -cc m.taller@kvsaarla +nd.de -s "How ya doin'?" -l "Something funny" -l "in the attachment +" -a c:\jokes.txt USAGE }


      holli, /regexed monk/

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: sourcecode [id://469311]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2024-03-19 04:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found