#!/usr/local/bin/perl # email.pl # # Allows flexible emailing from the UNIX command line # including the ability to send MIME email attachments. # # History Date Comments # V1.0 Nov. 8, 2001 Just out of Beta, works great :) use Getopt::Long; use MIME::Lite; $DEBUG=0; # 1 = Debug on, 0 = Debug off GetOptions ( "s=s" => \$subject, # -s = subject "f=s" => \$from, # -f = from "c=s" => \$cc, # -c = cc: "b=s" => \$body_file, # -b = body "a=s" => \$attachments # -a = attachment ); # Check to make sure there is at least on valid recipient. # If there isn't a valid recipient Display the man page. $num=@ARGV; if ( $num < 1 ) { &help(); exit(); } if ($DEBUG) { print "From: $from \n"; print "Subject: $subject \n"; print "Body File: $body_file \n"; print "Attachments: $attachments \n"; } # Create a new multipart message: $msg = new MIME::Lite; $msg->build( >From =>$from, To =>"@ARGV[0]", Cc =>$cc, Subject =>$subject, Type =>'multipart/mixed' ); for ($ct = 1; $ct < $num ; $ct++ ) { $msg->add(To => "@ARGV[$ct]"); } # Fill in the body of the email # # If -b contains a file name, populate the body with the contents of t +he file # If -b contains text and is NOT a filename, then fill the body in wit +h # that text # If -b is not defined, then put "No Message." in the body $nobody=0; if ($body_file) { unless (open BODY, $body_file) { $nobody=1; } # Is it a file ? if ( $nobody ) { # No, it's text $body = $body_file; } else { while ( <BODY> ) { # Yes, it's a file, +read it $body=$body.$_ ; } close (BODY); } } else { # -b is not specifie +d $body="No Message."; } # Add parts (each "attach" has same arguments as "new"): $msg->attach(Type =>'TEXT', Data =>$body, ); # Process the attachments and do base 64 mime encoding $attachments =~ s/\s+//g; # Strip all spaces @to_mime = split(/,/, $attachments); for ($ct=0; $ct < @to_mime; $ct++) { $_ = $to_mime[$ct]; $CONTENT_TYPE=""; if ($DEBUG) { print "Processing file $to_mime[$ct]\n"; print $_."\n"; } # Todo: Make this into a lookup table and add more MIME types if (/\.pcl$/i) { $CONTENT_TYPE="Content-Type: text/plain;"; } if (/\.txt$/i) { $CONTENT_TYPE="text/plain;"; } if (/\.ps$/i) { $CONTENT_TYPE="Content-Type: application/postscript;"; } if (/\.tif$/i) { $CONTENT_TYPE="image/tiff;"; } if (/\.doc$/i) { $CONTENT_TYPE="application/msword;"; } if (/\.xls$/i) { $CONTENT_TYPE="application/msexcel;"; } if (/\.csv$/i) { $CONTENT_TYPE="application/msexcel;"; } if ( $CONTENT_TYPE eq "" ) { die("Fatal Error: The content file $to_mime[$ct], must have an +extension of .doc .ps .txt .tiff .csv .doc .xls or .pcl .\n"); } if ($DEBUG) { print "Content Type: $CONTENT_TYPE, File Name: $to_mime[$ct]\n"; } $msg->attach(Type =>"$CONTENT_TYPE", Path =>$to_mime[$ct], Filename =>$to_mime[$ct] ); } # Send message in the "best" way (the default is to use "sendmail"): $msg->send; # # END OF MAIN CODE ################################################################### sub help { print <<"EOF"; ______________________________________________________________________ +______ email.pl -- Command line tool for sending email with attachments Usage ====== email.pl [-s subject] [-c cc-addr] [-b body-file || text message] [-a attach, attach, ...] [-f from-addr] to-addr ... Options: -s Specify subject on command line (only the first argument after the -s flag is used as a subject; be careful to quote subjects containing spaces.) -c Send carbon copy to email address -b File containing the body of the message, or if the file is not found, this text is used as the body of the message be careful to quote files names or text containing spaces. If this is left blank, the words "No message." will appear in the body of the email. -a File(s) to attach. If you are sending multiple files, comma delimit the file names and use double quotes. See valid attachment MIME types below. Attachment file names may NOT contain spaces. -f Specify the email address of the sender of the email message. If nothing is specified the current user name will be filled into this field. Examples: Sending multiple attachments email.pl -s "Statistcal Analysis" -f "me\@mydomain.com" -b file.txt + \\ -a "stats-10-5-2000.xls, stats-10-6-2000.xls, file.txt" \\ -c "test1\@domain.com" \\ user3\@domain.com Sending a single attachment and changing the body of the email email.pl -s "Spreadsheet" -b "See Attached.." -a file.csv \\ user\@domain.com Send the /etc/hosts file as the body of a message email.pl -b "/etc/hosts" user\@domain.com Valid Extensions and MIME type ============================== .doc -- msword .xls -- excel .txt -- text/plain ascii .ps -- application/postscript .tif -- image/tiff .pcl -- HP PCL5e (Hewlett Packard Printer Control Language V5e) EOF }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Sending email with MIME attachments from the UNIX command line
by Anonymous Monk on Nov 10, 2001 at 06:46 UTC | |
|
Re: Sending email with MIME attachments from the UNIX command line
by AltBlue (Chaplain) on Nov 11, 2001 at 09:01 UTC | |
by spike_hodge (Novice) on Jan 22, 2002 at 15:35 UTC |