How do I send e-mails from a shell script including file attachments?
The easiest solution is to send email from within shell scripts is mail command as follows. To send a message to one or more people, mail can be invoked with arguments which are the names of people to whom the mail will be sent:
mail -s 'subject' username mail -s 'subject' vivek@nixcraft.net.in mail -s 'Duplicate ip detected' -c vivek@nixcraft.net.in ipadmin@nixcraft.net.in </var/log/ipscan.log mail -s 'yum update failed' -c vivek@nixcraft.net.in -b sysadins@groups.nixcraft.net.in </var/log/yum.log mail -s 'Disk failure' vivek@nixcraft.net.in < /tmp/message
Where,
- -s 'word1 word2' : Specify subject on command line.
- -c : Send carbon copies to list of users.
- -b : Send blind carbon copies to list. List should be a comma-separated list of names.
- < /path/to/file : Read email body using this /path/to/file.
Method #1: Sending File Attachments
The mail command will not work. You need to use uuencode command to send a binary file called reports.tar.gz:
uuencode reports.tar.gz reports.tar.gz | mail -s "Weekly Reports for $(date)" admin@groups.mgmt.nixcraft.net.i
You can email images or any file using the same format:
uuencode file1.png file1.png | mail -s "Funny" users@groups.nixcraft.net.i
Method #2: File Attachments with mutt Command
The mutt is a MUA (mail user agent) - an email client for text based session. It can be used for reading electronic mail under unix like operating systems, including support color terminals, MIME (attachments), and a threaded sorting mode. You can use mutt command as follows to send email attachments:
mutt -s "Filewall logs" -a /tmp/fw.logs.gz vivek@nixcraft.net.in < /tmp/emailmessage.txt
Tip # 1: Empty Mail Body
To use an empty line as the mail body use special file /dev/null or echo command as follows:
echo | mutt -s 'Subject' -a attachment.tar.gz vivek@nixcraft.net.in mutt -s 'Subject' -a attachment.tar.gz vivek@nixcraft.net.in </dev/null mail -s "Disk failed @ $(hostname)" mobilenumber@services.api.nixcraft.net.in </dev/null
Tip #2: Writing Mail Body Using Here documents
The here documents (redirection) tells the shell to read input from the current source (HERE) until a line containg only word (HERE) is seen:
#!/bin/bash ... .... mail -s "Disk Failed" vivek@nixcraft.net.in<<EOF NAS server [ mounted at $(hostname) ] is running out of disk space!!! Current allocation ${_SPACE} @ $(date) EOF ... ..
Tip # 3: Conditional Mail
Use the if else if and the exit status of a command as follows:
[ $(grep -c -i "hardware error" /var/log/mcelog) -gt 0 ] && { echo "Hardware errors found on $(hostname) @ $(date). See log file for the details /var/log/mcelog." | mail -s "HW Errors" mobilephone@api.nixcraft.net.in ;}
OR
#!/bin/bash .... ..... # backup dirs using gnu/tar /usr/bin/tar --exclude "*/proc/*" --exclude "*/dev/*" --exclude '*/cache/*' -zcvf /nas05/backup.tar.gz /var/www/html /home/vivek # send an email if backup failed if [ $? -ne 0 ] then /usr/bin/mail -s "GNU/TAR Backup Failed" vivek@nixcraft.net.in<<EOF GNU/Tar backup failed @ $(date) for $(hostname) EOF else /usr/bin/logger "Backup done" fi .... .. # clean up rm $_filename
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop













{ 3 comments… read them below or add one }
That’s great and very helpful!
Thanks for introducing “uuencode”.
good stuff !!!
it took me months to figure out how to send HTML,
so here’s hoping this can save some1 else head ache…
mail -a ‘Content-Type: text/html’ -s “$ERROR” “$EMAIL” << EOF
NAS server [ mounted at $(hostname) ] is running out of disk space!!!
Current allocation ${_SPACE} @ $(date)
EOF
I tried the -a option for specifying content-type in Fedora and it did not work. what version of mail are you using on what OS?