How do I set Cron to send emails?

27,030

Solution 1

For this purposes you system should be able to send emails. So you could install and configure postfix:

sudo apt install postfix
  • For General type of mail configuration choose Internet Site, if you want to do more detailed configuration use the command:

    sudo dpkg-reconfigure postfix
    

At this stage Cron will start to send emails. Everything that usually will be outputted to the STDOUT (if you are execute a command in the command line), including all error messages, will be sent to the local mailbox of the user that runs the Cronjob.

The default location of local user's mail boxes is /var/mail/. You can install the command-line email client mutt to read your user's email box via the command line in a convenient way:

sudo apt install mutt
  • Note mutt installation process will involve installation and configuration of postfix if it isn't done before.

You can change the default destination mailbox by changing the value of the envvar MAILTO within crontab, before the definition of the Cronjob.

Please note: unless you haven't enabled SSL/TLS certificate within you send mail configuration, most of the public mail servers will ignore your emails in some way. For example mail.google.com will put them into the spam. If this is a server instance and you already have SSL/TLS certificate for your primary domain follow this nice manual to attach it to Postfix.

Once your system is able to send emails you must make your Cronjob more verbose (for e.g. add -v to the rm command) and must set proper value of MAILTO. So your crontab should look as this:

MAILTO="[email protected]"
* * * * * find /nfs/rpiggott/complete -mtime +45 -exec rm -v {} \;

Another approach is to create a script (which will be executed via crontab) that includes your command and uses mail, mutt, ssmtp or sendmail to send emails. See the bottom of the references for mor details.


References and further reading:

Solution 2

I used a pretty simple method to get cron to send emails: Backup Linux configuration, scripts and documents to Gmail.

Simplest way to automate sending email

From Send email alerts using ssmtp we find the simplest way of sending email automated from terminal or script. The installation steps are straight forward:

sudo apt install ssmtp
sudo nano /etc/ssmtp/ssmtp.conf
# Change "MyEmailAddress" and "MyPassword" to your own.

There is one step not mentioned; Google will send you an email confirming you want to allow a "less secure" application to send mail with your account:

gmail turns on less secure apps for email

There is an annoyance of getting too much mail. For example every time you mistype your sudo password you will get an email: Stop emailing me bad sudo password attempts

Share:
27,030

Related videos on Youtube

Ron Piggott
Author by

Ron Piggott

When I was 2 years old I had a rare hip disease. The disease wasn't well understood. During the following 3 years well meaning orthopedic surgeons prescribed treatment which did more damage than good. They eventually concluded surgical intervention was necessary. This surgery gave me 6 good years of mobility. But disturbing a joint prior to puberty set arthritis in motion in both of my hips and right knee joint. My mobility began deteriorating in my teens and accelerated as I went through my 20's. Given my mobility challenges I took a strong interest in computer programming during my teen years.

Updated on September 18, 2022

Comments

  • Ron Piggott
    Ron Piggott over 1 year

    I have the following cron job command running once daily on my NAS device:

    find /nfs/rpiggott/complete -mtime +45 -exec rm {} \;
    

    I am wondering if there is a way to pipe a list that will result in the cron sending an e-mail to me showing what file it delete and / or any errors experienced.

  • PerlDuck
    PerlDuck about 6 years
    Recent vesions of find also recognize the + sign instead of \;, i.e. find … -exec rm -v {} + (instead of find … -exec rm -v {} \;. Depending on the number of files this will greatly improve performance: with \; the rm command is run once per file (i.e. 1000 times for 1000 files) whereas the + variant will run rm with as many filenames as parameter as fit into the command line (i.e. it will call rm only twice or so, once with 800 files and a second time with 200 files).
  • PerlDuck
    PerlDuck about 6 years
    (continued) A drawback might be unspecific error messages like rm [800 filenames]: failed whereas the \; would help to better identify the error because just a single filename is given.
  • pa4080
    pa4080 about 6 years
    I just tested the difference between the outputs when \; or + is engaged while -exec rm -v {} is used, the output is identical so probably + is a better choice. @PerlDuck
  • PerlDuck
    PerlDuck about 6 years
    I think the real difference comes when there are errors. However, if you (or the OP) has only a few files to process (<100), then there's no significant difference, I guess.
  • MestreLion
    MestreLion about 3 years
    Instead of enabling Allow less secure apps you could instead Create an App Password and use that password in ssmtp instead of your own: Google will accept the email, not send to Spam, and as an added bonus you get the benefit of not keeping your real gmail password in your PC
  • WinEunuuchs2Unix
    WinEunuuchs2Unix about 3 years
    @MestreLion I love that idea! Would you have a link to a good tutorial?
  • MestreLion
    MestreLion about 3 years
    The official google documentation on App Passwords is by itself a pretty decent tutorial: support.google.com/accounts/answer/185833?hl=en