dotfiles/notes/shell/email_with_curl.md

3.1 KiB

Emailing with Curl

curl is an amazing networking tool. It can even automate sending emails! You'll need a app password or real password to login to your email account

Email just a file

For the most basic email, we can stuff the headers into the email file itself. Here's a basic example

cat <<EMAIL email.txt
From: Emiliko Mirror <emiliko@gmail.com>
To: Emiliko Mirror <emiliko@cs.ox.ac.uk>
Subject: Sleep triggered on $(hostname)
Date: $(date)

Dear me,

The system went to sleep! I thought I should notify my gmail account, so here
I am.

cheers,
Emiliko
EMAIL

curl --silent --ssl-reqd \
  --url 'smtps://smtp.gmail.com:465' \
  --user 'emiliko@cs.ox.ac.uk:<my-password-here>' \
  --mail-from 'emiliko@cs.ox.ac.uk' \
  --mail-rcpt 'emiliko@gmail.com' \
  --upload-file email.txt

The From: - Date: headers at the top are very important. Gmail seems to insert them automatically if they're missing, though other mail providers require them

If you use 2fa, you'll need to obtain an app password instead

Email with attachments

We can also CC, BCC and attach files with our curl emails

Attachments need a MIME type for the file, which is easiest obtained with the file command. In this example, we also remove the headers from the email file, opting to use the more explicit -H curl option

declare -r attach_file=mirrors_house.png
declare -r mime_type="$(file --mime-type "$attach_file" | sed 's/.*: //')"

cat <<EMAIL >email.txt
Dear classmates,

I just bought a new house! Check out the picture I attached below

OMGOMGOMG, I'm so excited!

cheers,
Kate Mirror
EMAIL

curl --silent --ssl-reqd \
  --url 'smtps://smtp.fastmail.com:465' \
  --user 'kate%40mirror.house:<my-password>' \
  --mail-from "kate@mirror.house" \
  --mail-rcpt 'emiliko@cs.ox.ac.uk' \
  --mail-rcpt 'lou@lou.me' \
  --mail-rcpt 'louis@louis.me' \
  -F '=(;type=multipart/mixed' \
  -F "=$(cat email.txt);type=text/plain" \
  -F "file=@${attach_file};filename=home.png;type=${mime_type};encoder=base64" \
  -F '=)' \
  -H "From: Kate Mirror <kate@mirror.house>" \
  -H "Subject: Check out my new place!" \
  -H "To: Emiliko Mirror <emiliko@cs.ox.ac.uk>" \
  -H "CC: Lou Mirror <lou@lou.me>" \
  -H "Date: $(date)"

Notice that for BCC the user isn't mentioned in -H at all, though still gets a --mail-rcpt

Oddly, some mail servers seem sensitive to the filename field. My university server would consistently bounce emails when I tried to have a filename field. Consider removing it to use the file's actual name

Further reading