This question already has an answer here:
I'm on a server running a Linux shell. I need to mail a simple file to a recipient. How to do this, prefereably using only the mail command?
UPDATE: got a good solution, using mutt instead:
$ echo | mutt -a syslogs.tar.gz admin@domain.org
Example using uuencode:
uuencode surfing.jpeg surfing.jpeg | mail sylvia@home.com
and reference article:
http://www.shelldorado.com/articles/mailattachments.html
$ echo | mutt -a syslogs.tar.gz admin@domain.org
But it uses mutt, not mail (or mailx).
mail
on every version of modern Linux that I've tried can do it. No need for other software:
matiu@matiu-laptop:~$ mail -a doc.jpg someone@somewhere.com
Subject: testing
This is a test
EOT
ctrl+d when you're done typing.
mail
which support this, but they are certainly not "plain old mail
" but rather, some modernized version or variant. It would help if you specify which version you are using, on which platform. - tripleee
mailx might help as well. From the mailx man page:
-a file
Attach the given file to the message.
Pretty easy, right?
-a
means Specify additional header fields on the command line such as "X-Loop: foo@bar" etc. You have to use quotes if the string contains spaces. This argument may be specified more than once, the headers will then be concatenated.
- Janus Troelsenmailx
doesn't support -a
(package mailx-8.1.1-44.2.2 on CentOS) - einpoklum-a
either (OS X 10.7.5) - Stefan Schmidt
My answer needs base64 in addition to mail, but some uuencode versions can also do base64 with -m, or you can forget about mime and use the plain uuencode output...
FROM=me@mydomain.com
TO=someone@mydomain.com
SUBJECT="Auto emailed"
MIME="application/x-gzip" # Adjust this to the proper mime-type of file
FILE=somefile.tar.gz
ENCODING=base64
boundary="---my-unlikely-text-for-mime-boundary---$$--"
(cat <<EOF
From: $FROM
To: $REPORT_DEST
Subject: $SUBJECT
Date: $(date +"%a, %b %e %Y %T %z")
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="$boundary"
Content-Disposition: inline
--$boundary
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
This email has attached the file
--$boundary
Content-Type: $MIME;name="$FILE"
Content-Disposition: attachment;filename="$FILE"
Content-Transfer-Encoding: $ENCODING
EOF
base64 $FILE
echo ""
echo "--$boundary" ) | mail
sendmail -t
instead. - Kyle MacFarlanemail
doesn't choke on MIME input, but you can just switch to | sendmail -oi -t
at the end of the pipeline in that case; you don't need any of the features that the mail
wrapper offers you any longer at this point. - tripleeeecho "--$boundary--"
before the closing parenthesis, with two dashes at the end to mark this as the final, closing boundary. - tripleee
mailx -a /path/to/file email@address
You might go into interactive mode (it will prompt you with "Subject: " and then a blank line), enter a subject, then enter a body and hit Ctrl+D (EOT) to finish.
mailx: illegal option -- a
- isomorphismesmailx
is not part of GNU coreutils. You can probably find a version of mailx
for OSX which supports this usage, but without a link to one, this isn't really helpful at all. There are multiple versions, many of which do not support this usage. - tripleee
mpack -a -s"Hey: might this serve as your report?" -m 0 -c application/x-tar-gz survey_results.tar.gz hesco@example.net
mpack and munpack work together with metamail to extend mailx and make it useful with modern email cluttered with html mark up and attachments.
Those four packages taken together will permit you to handle any email you could in a gui mail client.
Using ubuntu 10.4, this is how the mutt solution is written
echo | mutt -a myfile.zip -- admin@domain.org
mutt
from Homebrew - Stefan Schmidt
There are a lot of answers here using mutt or mailx or people saying mail doesn't support "-a"
First, Ubuntu 14.0.4 mail from mailutils supports this:
mail -A filename -s "subject" email@example.com
Second, I found that by using the "man mail" command and searching for "attach"
The following is a decent solution across Unix/Linux installations, that does not rely on any unusual program features. This supports a multi-line message body, multiple attachments, and all the other typical features of mailx
.
Unfortunately, it does not fit on a single line.
#!/bin/ksh
# Get the date stamp for temporary files
DT_STAMP=`date +'%C%y%m%d%H%M%S'`
# Create a multi-line body
echo "here you put the message body
which can be split across multiple lines!
woohoo!
" > body-${DT_STAMP}.mail
# Add several attachments
uuencode File1.pdf File1.pdf > attachments-${DT_STAMP}.mail
uuencode File2.pdf File2.pdf >> attachments-${DT_STAMP}.mail
# Put everything together and send it off!
cat body-${DT_STAMP}.mail attachments-${DT_STAMP}.mail > out-${DT_STAMP}.mail
mailx -s "here you put the message subject" nobody@test-address.com < out-${DT_STAMP}.mail
# Clean up temporary files
rm body-${DT_STAMP}.mail
rm attachments-${DT_STAMP}.mail
rm out-${DT_STAMP}.mail
On Linux I would suggest,
# FILE_TO_BE_ATTACHED=abc.gz
uuencode abc.gz abc.gz > abc.gz.enc # This is optional, but good to have
# to prevent binary file corruption.
# also it make sure to get original
# file on other system, w/o worry of endianness
# Sending Mail, multiple attachments, and multiple receivers.
echo "Body Part of Mail" | mailx -s "Subject Line" -a attachment1 -a abc.gz.enc "youremail@domain.com anotheremail@domain.com"
Upon receiving mail attachment, if you have used uuencode, you would need uudecode
uudecode abc.gz.enc
# This will generate file as original with name as same as the 2nd argument for uuencode.
mailx
which supports -a
for including MIME attachments, there is absolutely no need to separately uuencode
them. Attaching will wrap the content in a suitable content transfer encoding like base64
if necessary -- this is in fact more portable and robust than uuencode
, as well as decidedly a lot more usable. - tripleee
With mailx you can do:
mailx -s "My Subject" -a ./mail_att.csv -S from=noreply@foo.com recipient@bar.com < ./mail_body.txt
This worked great on our GNU Linux servers, but unfortunately my dev environment is Mac OsX which only has a crummy old BSD version of mailx. Normally I use Coreutils to get better versions of unix commands than the Mac BSD ones, but mailx is not in Coreutils.
I found a solution from notpeter in an unrelated thread (https://serverfault.com/questions/196001/using-unix-mail-mailx-with-a-modern-mail-server-imap-instead-of-mbox-files) which was to download the Heirloom mailx OSX binary package from http://www.tramm.li/iWiki/HeirloomNotes.html. It has a more featured mailx which can handle the above command syntax.
(Apologies for poor cross linking linking or attribution, I'm new to the site.)
I use mailutils and the confusing part is that in order to attach a file you need to use the capital A parameter. below is an example.
echo 'here you put the message body' | mail -A syslogs.tar.gz admin@domain.org
If you want to know if your mail command is from mailutils just run "mail -V".
root@your-server:~$ mail -V
mail (GNU Mailutils) 2.99.98
Copyright (C) 2010 Free Software Foundation, inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
mutt
does that nicely and reasonably portably. - tripleee