How can I make crontab email me with the output of its jobs? I have [email protected]
above the jobs, but it doesn't work.
I know I need to use something like Postfix or Sendmail but for the life of me I cannot find out how to achieve this. I've searched and searched for a simple guide on setting up Postfix but they're all insanely complicated and expect you to be setting up a whole server to send and receive email and to know all the terms (like, what is a domain name for outgoing emails?).
All I want to do is have crontab email me. Why is this so difficult??
Additional Info:
My crontab file looks like this:
[email protected]
1 0 * * * ~/Desktop/toskymesh.sh
59 6 * * * ~/Desktop/tooptus.sh
0 3 * * * snapraid sync
More Additional Info:
The output of ps -ef | grep '[s]endmail'
root 6840 1370 0 10:26 ? 00:00:00 sendmail: MTA: accepting connections
I know for sure cron is working, but I'm testing the mail command with echo Test | mail -s Test [email protected]
anyway.
In the end I used
sSMTP
. It's far simpler than eitherPostfix
orsendmail
and does the job beautifully.For future reference, here's how to use sSMTP with Yahoo Mail (don't worry, it's a lot less complex than it looks):
Use your package manager to download ssmtp. I used Synaptic, but
sudo apt-get install ssmtp
should work as well.Open the config file at
/etc/ssmtp/ssmtp.conf
.Make the config look like this:
Create the cert.pem file with OpenSSL. I used
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 9999 -nodes
(more info at How to create a self-signed certificate with OpenSSL). You can stick the file anywhere, but I just chucked it in ~/. Wherever you put it, make sure you point theTLS_CA_File=
line in ssmtp.conf to the correct location.Open the file
/etc/ssmtp/revaliases
and add the line (replacing the appropriate sections with your details):If you're running as root, I assume you would need to add another line replacing your name with 'root'.
That's it, you're good to go! To test, the easiest way (IMO) is to create a file with the following in it:
Check that you don't have the real sendmail installed by running
sendmail -V
. It should say 'sSMTP'.Finally, run
cat fileWithEmailInIt.txt | sendmail -i -t
, then wait a few seconds (10-30) and check your email!Additional note 1: If you have trouble with Gmail, try option 1 of this answer.
(Thanks to Ben Creasy!)
Additional note 2: If mail is sending from the command line but not through crontab, try changing
FromLineOverride
toNO
in/etc/ssmtp/ssmtp.conf
. You can also get more detailed logging by addingDebug=YES
tossmtp.conf
- the extra logging goes to/var/log/mail.log
.(Thanks Jakub Kukul!)
Install Postfix. It is more complicated than most other packages but it's still not complicated.
Select "Internet Site" and then accept all the defaults. Then we just need to stop outside connections, turning this into a "null client". Run:
sudoedit /etc/postfix/main.cf
and find theinet_interfaces
setting (near the end) and change it toloopback-only
, like so:And finally restart Postfix with
sudo /etc/init.d/postfix restart
(reloading won't do).You now have a Postfix install that won't relay email for outside machines, it'll just accept connections on 127.0.0.1 (and ::1 for IPv6).
On a separate note, your cron lines are probably not working because you're using non-relative paths and paths with Bash substitutions in.
sh
doesn't understand~
and it might not have a properPATH
set. So replace them with (I'm just guessing at the actual paths):And if your scripts require to be run from a specific directory, make sure they
cd
into the right directory. Don't assume thatcron
will be in the right place as it likely won't.I had very good luck with exim4.
(alpine is just the mail client I like using)
After that, I ran
and followed through the prompts. This page: https://help.ubuntu.com/community/Exim4 was very helpful as well. It took me about 10 minutes to get it running.
In case you don't want email notifications, but want to log cron jobs' output somewhere to be able to inspect it if need be:
Select "Local only" when asked for a mail server configuration type.
To confirm that
cron
will be able to send mail:Alternatively add a
cron
job:Wait for it to run (
journalctl -ef
orwatch date
), thencat /var/mail/root
.From sSMTP manpage: "It does not do aliasing, which must be done either in the user agent or on the mailhub. Nor does it honor .forwards, which have to be done on the recieving host. It especially does not deliver to pipelines."
So, if you want to receive all msgs sent to root on your extenal email, it's a bad idea to use sSMTP, because it does not support aliases.
Instead, you could user postfix. It's still very simple. Here's how to use it with gmail as your smtp for sending messages:
General type of mail configuration: Satellite system
System mail name: The preferred fully-qualified name of the mail server, e.g., mail.example.com
SMTP relay host (blank for none): [smtp.gmail.com]:587
Add to /etc/postfix/main.cf:
Create /etc/postfix/sasl/sasl_passwd
Then:
Edit /etc/aliases and add:
Lastly, run:
Now, you can test if redirecting is working:
Hope it helps.
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:
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:
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