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 |
I don't think "mail" will handle true mime type attachments. You may want to look into "Mutt"
KC |
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; } |
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 |
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. |
Thank you both, however, the script that I provided works perfectly for me without installing a thing :)
-Ronny |
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. |
As far as 1 know:
mail -a filename should do the trick |
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 |
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 |
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..
|
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. |
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. |