Attaching and Bashing

(bash, email, mime)

One day, you may find yourself sitting at a terminal trying to send an email with a MIME attachment. Easy, you think to yourself. Only you can’t install anything onto the server without triggering a long-winded QA process, and it’s then you discover that the machine only has /bin/mail and sendmail available. Oh, and no base64 tools like mpack.

You may ask yourself, how do I work this?

#!/bin/bash

SUBJECT="Hello!"
FROM="test@foo.com"
TO="blah@foo.com"
FILENAME="/path/to/file"
BODY="This is the text body!"

ATTACHMENT=`perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' < $FILENAME`

/usr/lib/sendmail -t <<ENDMESSAGE
From: $FROM
To: $TO
Subject: $SUBJECT
Mime-Version: 1.0
Content-Type: Multipart/Mixed; boundary="ATTACHMENT"


If you can read this, you can't read MIME-encoded emails. 

--ATTACHMENT


$BODY


--ATTACHMENT
Content-Disposition: attachment;
        filename="$FILENAME"
Content-type: $MIME;
        charset=US-ASCII;
        name="$FILENAME"
Content-Transfer-Encoding: base64


$ATTACHMENT


--ATTACHMENT--
ENDMESSAGE

Never let it be said that Snappish Thoughts isn’t a full-service blog. Okay, yes, it does depend on perl being installed with MIME::Base64, but this server had them, so there. If you want to write a base64() function in bash, consider that an exercise (you can, of course just use quoted-printable instead, but that can get you in trouble, whereas base64ing is much safer. And yes, you want to be careful you don’t run this on a 10GB file as it’ll do fun and interesting things as bash/perl run out of memory, but for attachment-sized files, you should be fine)!

blog comments powered by Disqus