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 <[email protected]>
To: Emiliko Mirror <[email protected]>
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 '[email protected]:<my-password-here>'
--mail-from '[email protected]'
--mail-rcpt '[email protected]'
--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 "[email protected]"
--mail-rcpt '[email protected]'
--mail-rcpt '[email protected]'
--mail-rcpt '[email protected]'
-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 <[email protected]>"
-H "Subject: Check out my new place!"
-H "To: Emiliko Mirror <[email protected]>"
-H "CC: Lou Mirror <[email protected]>"
-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