[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: Command line mail program (mail)



On Tue, 2004-05-11 at 13:24, Gustavo Gouvea wrote:

> I was using "mail" to send a backup report on my FedoraBox,
> but now I need to send an attachment.
> 
> Can I do that with "mail"? I searched the man page, and
> havent found anything.
> 
> Is there a way to send files as attchments in the cmd line?

	I cop'ed this perl script off of the net a little while back.  It's
been working for me.

-- 
Joe "Kuramarujo" Klemmer | Current rank: Maegashira 15
http://www.webtrek.com/~klemmerj/sumo.html
#!/usr/bin/perl -w
#
# simple program to send a text message with an attachment
#
# William Julien
###

use strict;             # turn on the strict pragma
use Getopt::Std;        # use standard getopt to parse options

$/ = undef;             # turn on slurp mode

#
# scope local variables
#
my ($date,              # the current date
   $sendmail,          # the sendmail command
   $document,          # the document text
   %options,           # program options
   $filename,          # a file to send
   $file,              # the content of a file
   @filelist,          # list files to send
   $tolist,            # list of comma separated email addresses
   $today,             # today's date
   $usage,             # program usage
   $man,               # program man page
   $subject,           # email subject
   $extent,            # file extension
   %mime_type,         # list of supported application context mime types
   $mime_type,         # current mime application content type
   );

#
# variable initializations
#
$man = <<MAN;
NAME
   mime_mail

DISCRIPTION
   This program is a command line mailer that sends a text file
   description and one or more files in mime attachments. On success,
   mime_mail will work silently.

SYNOPSIS
   mime_mail -h | -d document.txt -s "mail subject"
             -u "user1 [,user2 ...]" -f "file1 [,file2 ...]"

OPTIONS
   -h
       Displays a man page.

   -d document.txt
        Sends "document.txt" in the mail message body. The file must
       be a normal text file. If a "-" is provided as an argument,
       the input will be taken from stdin. If no "-d" argument is
       supplied, the attachment will be sent with the message
       "Please see the attached.".

   -s "mail subject"
       Sets the mail subject. The mail subject must be quoted if the
        subject contains any spaces.

    -u user1,user2 ...
       A comma separated list of email addresses or aliases. Quotes
       are required if the list contains any spaces.

    -f file1,file2 ...
       A comma separaed list of files to attach. Quotes are required
       if the list contains any spaces. The files can be of any type.
       The recognised application content types are ".doc", ".html",
       ,"htm",".xls", ".csv", ".pdf", ".rtf", and ".mdb".

William Julien
425-865-5511
MAN
$usage = <<USAGE;

Usage:
mime_mail -h | -d document.txt -s "mail subject"
         -u "user1 [,user2 ...]" -f "file1 [,file2 ...]"
USAGE
$sendmail = "/usr/sbin/sendmail";
if ( ! -f $sendmail ) {
   die "Sorry -- cannot locate sendmail at $sendmail.\nYou must edit $0\n";
}
$today = scalar(localtime());
%mime_type = ("doc"   => "application/msword",
             "txt"   => "text/plain",
             "htm"   => "text/html",
             "html"  => "text/html",
             "xls"   => "application/vnd.ms-excel",
             "csv"   => "application/octet-stream",
             "pdf"   => "application/acrobat",
             "rtf"   => "application/rtf",
             "mdb"   => "application/vnd.ms-access",
            );

#
# process program options
#
getopts('d:s:u:f:h', \%options) or die "$usage\n";
if ( defined $options{"h"} ) {
   print "$man\n";
   exit;
}
if ( defined $options{"f"} ) {
   @filelist = split /\,/,$options{"f"};
   foreach $file (@filelist) {
       if (! -f $file) {
           die "$0: cannot open $file\n";
       }
   }
} else {
   die "$usage\n";
}
if ( defined $options{"d"} ) {
   $document = $options{"d"};
   if ( $document eq "-" ) {
       $document = <STDIN>;
   } else {
       if ( -f $document ) {
           open F, "$document";
           $document = <F>;
           close F;
       } else {
           die "$0 error: cannot open $document\n";
       }
   }
} else {
   $document = "Please see the attached.\n";
}
if ( defined $options{"s"} ) {
   $subject = $options{"s"};
} else {
   die "$usage\nError: No Subject\n";
}
if ( defined $options{"u"} ) {
   $tolist = $options{"u"};
} else {
   die "$usage\n$0 error: no subject specified\n";
}
open MAIL, "|$sendmail -t";
print MAIL <<HEADER;
To: $tolist
Subject: $subject
Date: $today
Mime-Version: 1.0
Content-Type: multipart/mixed;
        boundary="ThisRandomString"

This mail was formatted with mime_mail (wmj)

--ThisRandomString
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

$document
HEADER
foreach $filename (@filelist) {
   $extent = $filename =~ /\.(\w+)$/ ? "\L$1" : undef;
   $mime_type = "application/octet-stream";
   if ( defined $extent ) {
       if ( defined $mime_type{"$extent"} ) {
           $mime_type = $mime_type{"$extent"};
       } else {
           $mime_type = "application/octet-stream";
       }
   }
    open F,"$filename";
   $file = <F>;
   close F;
   $file = encode_base64($file);
   print MAIL <<FILE;
--ThisRandomString
Content-Type: $mime_type; name="$filename"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$filename"

$file
FILE
}
print MAIL "--ThisRandomString--\n";
#
# send the mail
#
close MAIL;

#
# fin
###

sub encode_base64
{
   use integer;
   my $res = "";
   my $eol = $_[1];
   $eol = "\n" unless defined $eol;
   pos($_[0]) = 0;                          # ensure start at the beginning
   while ($_[0] =~ /(.{1,45})/gs) {
       $res .= substr(pack('u', $1), 1);
       chop($res);
   }
   $res =~ tr|` -_|AA-Za-z0-9+/|;            # `# help emacs
   # fix padding at the end
   my $padding = (3 - length($_[0]) % 3) % 3;
   $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
   # break encoded string into lines of no more than 76 characters each
   if (length $eol) {
       $res =~ s/(.{1,76})/$1$eol/g;
   }
   return $res;
}

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]