Solved

Send an email with attachments from the command line

Posted on 2001-08-30
9
1,892 Views
Last Modified: 2008-06-04
How can I send and email with file attachments from the command line.

Thanks Phil.
0
Comment
Question by:phil2_curtis
9 Comments
 
LVL 3

Expert Comment

by:jnbkze
ID: 6443740
you can do something like this:

$ uuencode my_attachment a_new_file_name | mail -s "this is the subject" me@mymail.com

This will send me@mymail.com an email with an attachment called a_new_file_name

Hope this helps
0
 
LVL 17

Expert Comment

by:dorward
ID: 6444310
You can use the mutt email client.

mutt email@ddress -a filename.to.attache -s "Subject of email" < file.containing.message.body

or

Another program that produces output that you want as the message body | mutt email@ddress -a filename.to.attache -s "Subject of email"

0
 
LVL 1

Expert Comment

by:elniniokev
ID: 6445254
mail whoever@wherever.com -s "hello there" < attachment
0
 
LVL 17

Expert Comment

by:dorward
ID: 6445839
Isn't 'mail whoever@wherever.com -s "hello there" < attachment' only suitable for plain text attachments?
0
Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

 
LVL 5

Accepted Solution

by:
moonbeam012200 earned 50 total points
ID: 6448232
The problem with using the easy uuencode or other "unix style" encodings is that it lacks the proper mime boundries and the correct mime types to allow the proper application by graphical mailers. Also needed is the capability to send a multipart text header, perform the proper base64 encoding for binary content, allow for multiple documents and multiple recipients.

To solve this problem, I wrote my own command line mailer out of perl, mime_mail. Perl version 5.005 or better is required. The "man" page is is printed with 'mime_mail -h'

-->mime_mail -h
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

Here is the source.

-->cat /home/moonbeam/cmd/mime_mail
#!/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
MAN
$usage = <<USAGE;

Usage:
mime_mail -h | -d document.txt -s "mail subject"
          -u "user1 [,user2 ...]" -f "file1 [,file2 ...]"
USAGE
$sendmail = "/usr/lib/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;
}
0
 

Expert Comment

by:drabaecus
ID: 6646685
*ping*
0
 
LVL 5

Expert Comment

by:moonbeam012200
ID: 6649482
I'm still here. Happy thanksgiving!
0
 

Author Comment

by:phil2_curtis
ID: 7137287
I will give you the points, even though I didn't use your example. My solution was along the same lines and that was to write my own program to do the task.

Phil
0
 

Expert Comment

by:jshandel
ID: 8560847
Compliments to the moonbeam chef. It worked like a charm!
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

I am a long time windows user and for me it is normal to have spaces in directory and file names. Changing to Linux I found myself frustrated when I moved my windows data over to my new Linux computer. The problem occurs when at the command line.…
Fine Tune your automatic Updates for Ubuntu / Debian
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now