≡ Menu

UNIX / Linux: Shell Scripting With mail Command

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.in

You can email images or any file using the same format:

uuencode file1.png file1.png | mail -s "Funny" users@groups.nixcraft.net.in

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 -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
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 8 comments… add one }
  • Devarishi October 12, 2010, 7:43 pm

    That’s great and very helpful!

    Thanks for introducing “uuencode”.

  • marc October 14, 2010, 1:53 pm

    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

    • Will September 2, 2011, 5:10 pm

      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?

  • Jboydjvc February 18, 2014, 11:27 pm

    How do i add email notification to my shell when runed

  • sreenath February 20, 2014, 2:47 pm

    I have tried all the ways, but none of them is working for me. Its throwing error
    mail: invalid option — ‘c’
    Try `mail –help’ or `mail –usage’ for more information.
    I have tried installing mutt and mailutils. But no luck.

    Please help me in getting this error resolved.

  • Luke Watkins August 21, 2016, 11:58 am

    How could I send an email notification when a certain process (configures to run at startup) is not running or fails?

    • Vivek Gite August 21, 2016, 7:48 pm

      Check for process id using pgrep. If not found send an email. Create a script and call at @reboot cron job.

  • Ashif February 28, 2017, 8:51 am

    Hi,
    i created a job in jenkins, in s single job am running two builds, one is Ant build that i run through shell script and second by triggering build.In this single build both Ant and further process runs.I am getting mail notifications for final build thats fine.but i need an mail notification for Ant build which i am running by shell script.what Commands should i use to get mail notifc.please any one guid me in that.

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , , , , , , , , , , , , , , , , , , ,