I have a long-running project to make timelapse movies using a Raspberry Pi Zero with camera module. I’m capturing a countryside view and have images for two years. The uptime on the Pi is seriously impressive, but nonetheless I wanted to upgrade the Pi so that it would send me updates of how it’s going, so that I would know if it image capture had failed. Here is my solution.
To recap: the camera takes images at 10 min intervals then, at the end of the day, it transfers all of the days photos to a file storage server. Once per week the old images get deleted from the Pi. I use another computer to pull down the images from the server and generate the time lapse movie so that I get an updated view of how the project is progressing.
Due to a change which is too boring to detail, I no longer get a daily update on this process, so I wanted to set up an email-based alert scheme.
Fortunately, this is straightforward to do on a Raspberry Pi.
Setting up SSMTP on the pi
Log in to the pi using ssh and run
sudo apt-get install ssmtp
…to install ssmtp. It’s good practice to backup the existing configuration file.
sudo mv /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.bak
Now create a new configuration file where we will store our details:
sudo nano /etc/ssmtp/ssmtp.conf
In nano, I pasted in the details below and substituted my credentials for address and password. I used a gmail account that was setup for the purpose of automated messaging. IMPORTANT: this account needs to set “Less Secure App Access” to ON. You can find this in the settings after logging in to that account (currently under Security, but it does move around).
root=myaccount@gmail.com
mailhub=smtp.gmail.com:587
FromLineOverride=YES
AuthUser=myaccount@gmail.com
AuthPass=mypassword
UseSTARTTLS=YES
UseTLS=YES
Save and quit with ctrl+X and Y. Now, secure the configuration file:
sudo groupadd ssmtp
sudo chown :ssmtp /etc/ssmtp/ssmtp.conf
Finally, I checked that I could send email from the command line using
echo "Hello, World!" | ssmtp fakeaddress@someplace.com
I used another email account in place of fakeaddress@someplace.com and confirmed that I got the message.
Automating emails
Currently, the bash script to upload the photos runs daily via cron. This runs using rsync and I simply wanted to send the output from rsync to myself via email. So, I just needed to add this to the bash script and I would be done!
To explain how I approached this, here is an example:
ssmtp fakeaddress@someplace.com < msg.txt
As long as msg.txt is formatted correctly, this command will send an email. You can test this out by making a msg.txt file:
To: fakeaddress@someplace.com
From: myaccount@gmail.com
Subject: alert
The server is down!
Note that there is a carriage return between the subject and body.
If you run the command above after creating that file, you will receive an email from your Pi!
So, my idea was to make a file called header.txt and add the output from the file transfer to it and then send the resulting txt file via ssmtp in the bash script.
Step one, in the same directory as my bash script, I made a file called header.txt that looked like this:
To: fakeaddress@someplace.com
From: nasfagen@gmail.com
Subject: PiCam update
Here is the output
Step two, I modified the bash script. The original script was:
#!/bin/bash
sudo mount -t cifs -o user=xxx,pass=xxx,vers=1.0 //server.address/xxx/ /mnt/abc
sudo rsync -trv camera/ /mnt/abc/camera/
sudo umount /mnt/abc
I changed it to
#!/bin/bash
sudo mount -t cifs -o user=xxx,pass=xxx,vers=1.0 //server.address/xxx/ /mnt/abc
sudo rsync -trv camera/ /mnt/abc/camera/ > output.txt
sudo umount /mnt/abc
# concatenate output with the correct header and email it
cat header.txt output.txt > msg.txt
/usr/sbin/ssmtp fakeaddress@someplace.com <msg.txt
# backup the output (in case we need to look at it)
mc output.txt output.txt.bak
# now create blank file in its place
touch output.txt
The output from rsync goes to a file called output.txt. This gets joined with the header to make the msg.txt file.
Note that I used the full path to ssmtp since when the script runs under cron, ssmtp is not found in the path.
Conclusion
This works well. I am getting daily emails about the upload and the absence of an email or a blank body email will tell me that there is a problem with the Pi.
Of course, there are other ways to tackle this. For example, getting the server to send the message (and do so only in the absence of an upload), but the approach outlined here was simple to set up. I also modified the deletion script so that I get an email about that too!
—
The post title comes from The Bee Gees’ single “I’ve Gotta Get A Message to You”. The Raspberry Pi is undergoing a different type of execution than the person in the song’s lyrics.
I tried the steps under “Setting up SSMTP on the pi” and the echo test at the end gave me “bash: mail: command not found. Any ideas?
Hi William, ah yes sorry, I think that’s an error in the post. It should be:
echo “This is a test” | ssmtp fakeaddress@someplace.com
I will edit it.