Every week we forget trash day, so I’ve been meaning to write a script to remind all of us the night before to put the trash cans out.
I only wanted to type the phone numbers once, so I hard-coded them as variables into the script. Turning the command line argument ‘kj’ into the value of $kj was by far the most difficult because I had to look up how to do indirect references in bash, which, as it turns out, is kind of a pain.
In an effort to spare you that same pain, I’m posting the code here.
If you call the file text_reminder.sh, the usage is as follows:
text_reminder.sh [path to reminder] [recipient(s)]
[path to reminder]
This script can be used to send you several reminders. It looks for a file at the specified path, then uses the text of that file as the body of the e-mail/text. Be sure to create the reminder file before you run this script. For the purposes of example, let us assume it’s in ~/reminders/reminder.txt. Remember to keep it brief – it will be split into 140-character increments, so if you send an 1,000-character reminder, it’s going to arrive as eight annoying, disjointed texts.
I hard-coded shortcuts into the code so I can use aliases instead of relying on myself to having to type a phone number more than once. You can set up as many recipients you want, but note that the code, as it is pasted below, will fail because there are no real recipients set up. You’ll need to add at least one to get any use out of this code.
Setting up a recipient is fairly simple: most (all?) cell phone companies allow you to text message customers via e-mail with an address following the format [10-digit phone number]@[domain]. Finding the value of [domain] is the most time-consuming part, because each company has a different domain, so you need to ask each potential recipient who their cell phone company is, then dig up the corresponding domain. I used this page as a reference, but it may be out of date by the time you read it. If your phone number is (503)555-1234, and you’re a T-Mobile customer, the address at which my phone receives texts is email@example.com.
As always, send several tests before using it for real.
firstname.lastname@example.org' # CHANGE THIS
# etc, you can set up as many aliases as you like.
if [ "$#" -lt 2 ]; then
echo Usage $0 [path to reminder] [recipients]
echo Recipients defined: kj, eric # CHANGE THIS
if [ ! -f $reminder ]; then
echo The reminder you specified, $reminder, does not exist.
while [ $i -le $# ]; do
varname=`eval echo $numvar`
vartoeval=`eval echo $varname`
recipient=`eval echo $recipient2`
if [ "$recipient" == "" ]; then
echo I do not understand the recipient $recipient
echo mail "$recipient" -s 'Friendly reminder' -r email@example.com -a $reminder
mail "$recipient" -s 'Friendly reminder' -r "firstname.lastname@example.org" < $reminder
In order to make this run regularly, you’ll need to create a cron job. You can do that by running “crontab -e”. On most systems, this will default to vi, which can be kind of scary to the uninitiated, so here’s a cheat sheet.
I’m going to assume you’re uninitiated: Copy and paste the following into a text editor you feel comfortable with:
0 21 * * 1 ~/bin/text_reminder.sh ~/reminders/reminder.txt kj eric
This will send a text to each recipient listed reminder at 9 PM every Monday night contain. Change the path and recipient(s) to your liking, then copy the whole thing. Switch to the window where you ran “crontab -e” and vi awaits you. Type “i” to enter “insert” mode – this will allow you to use vi like a normal text editor. Paste.
Hit the “esc” key (top left side of your keyboard) to exit “insert” mode. Type “:wq” to save your changes and exit. If you screw up and you don’t want to save your changes, you can exit with “:q!”.
This was pretty quick and dirty, but a couple glaring improvements stand out:
- Allow the user to specify a subject. At the very least, make the hard-coded subject a variable so that it remains uniform between the line that sends the mail, and the line below that prints the send command used.
- I could have put the aliases in some kind of array, which would have allowed for more robust error-checking and prevented the user from having to manually change the usage instructions.
- Some of the variable names in the while loop are awful.