LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (https://www.linuxquestions.org/questions/linux-software-2/)
-   -   Sending an attachment from a command line (https://www.linuxquestions.org/questions/linux-software-2/sending-an-attachment-from-a-command-line-329755/)

RonnyNussbaum 06-02-2005 08:06 PM

Sending an attachment from a command line
 
Hello,
Forgive me if this is the wrong forum.

I'm running Fedora Core 3, and have Postfix running on it.
Postfix is configured to forward any message to root@mydomain.com, to my e-mail (ronny@mydomain.com).

I used the "mail" command-line application, and sent myself a text file:

cat text_file |/bin/mail -s "this is a test" root

This sent the file "text_file" to me, and I got it pasted into the message body. However, I'm trying to make it appear as an attachment.

My other requirement is that I want to use only the command line only, no GUI.

Can I use Postfix to send it (instead of "mail")?
Or maybe I can use "mail" somehow, but still have it appear as an attachment.

I appreciate any help.

Thanks

-Ronny

kencaz 06-02-2005 08:20 PM

I don't think "mail" will handle true mime type attachments. You may want to look into "Mutt"

KC

RonnyNussbaum 06-02-2005 08:27 PM

Thanks for your reply.
I was able to find a cool Perl script that is very simple, and does everything I wanted, so I wanted to post it here.

It's taken from here: https://www.redhat.com/archives/fedo.../msg02178.html

And also pasted below.

Thanks

-Ronny

#!/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;
}

JaBa 06-03-2005 04:00 AM

Install mutt (http://www.mutt.org)

And try this:

cat sometext.txt | mutt your-name -a /home/your-file-to-send -s "<Yoursubject>"

The 'your-name' from above has to be set in the '/etc/aliases' file: (i am not sure of this for Fedora):

your-name: youremail@domain.com

That's all !

Greetz.
JaBa

tronayne 06-03-2005 05:47 AM

If you have POSIX-compliant mailx, this little script will do the job (the file name will be in the subject line):

#!/bin/ksh
cat ${1} | uuencode "${1}" | mailx -s ${1} you@where.what

Try it. If the file you give as an argument arrives as an attachment, you have a POSIX-compliant mailx program. If it arrives as text body, you don't so you can

echo "Here it is" | mailx -s "subject" -a filename you@where.what

You need the echo so you don't have to enter a control-D to end the message and "filename" is the name of the file you want attached.

Hope this helps.

RonnyNussbaum 06-03-2005 06:56 AM

Thank you both, however, the script that I provided works perfectly for me without installing a thing :)

-Ronny

goeko 06-05-2005 11:16 PM

Another way to get this done.
 
Just to point out another way to get this done, if for some reason someone chooses not to use your fine script Ronny

I ran across this problem emailing html web reports, and didn't want to create my own script because I didn't know the requirements for mime headers good enough. So I found a tool called

mime-construct

which is in the debian distribution. And I have been using that, which is working great for me.

==>brian.

nobody 06-06-2005 05:32 AM

As far as 1 know:
mail -a filename
should do the trick

RonnyNussbaum 06-06-2005 10:57 AM

Thanks
 
Thanks for the advice goeko.

"nobody": Mail -a filename sends the file inside the message, as if you did a cut-paste of the contents of the file.

-RoNNY

nobody 06-06-2005 03:00 PM

Thanks RoNNY, you are right. I'm using SUSE 8.x and this uses nail. But /usr/bin/mail is linked to nail and therefore everytime I type in 'mail' it starts nail.
So the correct thing would have been

nail -a filename

Chiragrs 06-01-2007 03:57 PM

Great Program
 
This Program is excellent.. I use it to send attachments all the time.. It works for all mail providers EXCEPT hotmail.. Do you know why this is? Is it a bug in the program or some setting in hotmail?? Please help as my primary email is in hotmail..

nobody 06-02-2007 04:09 AM

Sory i dont know what the problem is.
I never used hotmail.
I normaly use gmx and there it works fine but it also worked with other mail providers as you also stated.

Chiragrs 06-04-2007 11:47 AM

Here's another excellent perl script that allows you to do more. Check it out.. And I tested it.. it works for hotmail, gmail and yahoo!

http://caspian.dotconf.net/menu/Software/SendEmail/


All times are GMT -5. The time now is 02:00 AM.