an other suggestion: pine
Main Topics
Browse All TopicsI run through help for mail but couldn't find any option to attach the file in the email.
How can I do it?
Thanks.
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
I understand your frustration. Many times I have had a need
from within a cron job or a script to send mail with text
and an attachment. If you are sending a file to a microsoft
person, you can just do:
uuencode file name | mailx -s file dest
This works because microsoft mailers to not follow the rfc
standards for uuencoded attachments. A unix client will
not see an attachment, but a uuencoded data block. (Which
is OK, for the uudecode savy unix people!)
The desired formatting would be a properly formatted
encoded attachments is a plain/text header and a base64
translated attachment. To achieve this, I wrote my own
mailer using perl. This mailer is meant to be used from
either a cron job or at the command line. The syntax is:
-->mime_mail
Usage: mime_mail -h | -d document.txt -s "mail subject"
-u "user1 [,user2 ...]" -f "file1 [,file2 ...]"
Full help ...
-->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
-->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
With this utility you can send a properly formatted attachment with a text header.
Here is the perl script:
#!/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/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:
$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:
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;
}
#!/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/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:
$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:
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;
}
IceMountain,
Some of these questions have been open for some time. Please resolve them appropriately as soon as possible. Continued disregard of your open questions will result in the force/acceptance of a comment as an answer; other actions affecting your account may also be taken. I will revisit these questions in approximately seven (7) days.
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
http://www.experts-exchang
Please note that an Easy question is normally considered to be worth 50 points.
Thanks,
Netminder
Community Support Moderator
Experts Exchange
I add a new option for EXCELENT William's script.
Congratulations William.
#!/usr/bin/perl -w
#
# simple program to send a text message with an attachment
#
# William Julien
###
#
# Create a new option to choose message type (text | html)
# 08/27/04 Daniel Bauermann
###
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
$typemessage, # define type message (new option)
$headertypemessage, # content type message (new option)
);
#
# 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 ...]" -t [text|html]
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".
-t [text|html]
Message type
William Julien
425-865-5511
MAN
$usage = <<USAGE;
Usage:
mime_mail -h | -d document.txt -s "mail subject"
-u "user1 [,user2 ...]" -f "file1 [,file2 ...]" -t [text|html]
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:t', \%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";
}
#
# New option
#
if ( defined $options{"t"} ) {
$typemessage = $options{"t"};
} else {
$typemessage = "text";
}
if ( $typemessage eq "text" ) {
$headertypemessage = "Content-Type: text/plain; charset=us-ascii\nContent-
} else {
$headertypemessage = "Content-Type: text/html;\n charset=\"iso-8859-1\"\nCo
}
#
# End new option
#
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
$headertypemessage
$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:
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;
}
Business Accounts
Answer for Membership
by: dorwardPosted on 2001-08-04 at 01:22:14ID: 6351117
Do you mean the mail program started with "mail".
l
I don't think there is a way, I suggest using mutt for the mail client instead, if you don't have it already you can find it on http://freshmeat.net/
Issue "mutt --help" for a list of commands, but you could do something like this:
mutt -x -a filename.to.attach -s "Subject that you want" email@address.to.send.to
The -x will start in mailx emulation mode, you can leave that off and get the body of the email from a file instead:
mutt -a filename.to.attach -s "Subject that you want" email@address.to.send.to < file.name.for.body.of.emai
Or leave of the included body altogether to start your default editor to type a body.
mutt -a filename.to.attach -s "Subject that you want" email@address.to.send.to
Or just run "mutt" to use it as any email client.