Made with GatsbyJS , Image by rawpixel, and icons from feather
Logo

Save Emails as PDFs

Someone posed the question of how to preserve emails on the Mac as PDFs here. It was a question I was curious about and had no idea how to answer. So, I started to do my research.

Mail Rules

It turns out, in Mail.app, there are rules that can be created sending emails to particular locations. More importantly and interesting is that you can run Applescripts within these rules. I also found this script and slightly modified it. It essentially saves any email called on this script to the specified folder.

using terms from application "Mail"
	on perform mail action with messages theMessages for rule theRule
		tell application "Mail"
			set msgs to selection

			if length of msgs is not 0 then

				set theFolder to (system attribute "HOME") & "/Downloads/"

				repeat with msg in msgs
					set msgContent to source of msg
					-- determine date received of msg and put into YYYY-MM-DD format
					set msgDate to date received of msg
					-- parse date SEMversion below using proc pad2()
					set {year:y, month:m, day:d, hours:h, minutes:min} to (msgDate)
					set msgDate to ("" & y & "-" & my pad2(m as integer) & "-" & my pad2(d))

					-- assign subject of msg
					set msgSubject to (subject of msg)

					-- create filename.eml to be use as title saved
					set newFile to (msgDate & "-" & msgSubject & ".eml") as rich text
					set newFilePath to theFolder & newFile as rich text

					set referenceNumber to open for access newFilePath with write permission
					try
						write msgContent to referenceNumber
						delete msg
					on error
						close access referenceNumber
					end try
					close access referenceNumber

				end repeat

			end if -- msgs > 0
		end tell
	end perform mail action with messages
end using terms from

on pad2(n)
	return text -2 thru -1 of ("00" & n)
end pad2

To PDF!

It runs out there are tons and tons of different ways to convert a file into a pdf and equally as many to convert .eml to .html. Some are easy and some are difficult. In the end I found wkhtmltopdf and mailparser to work the best.

That left me with a quick bash script to run it on every file in location where the emails are saved to from the rule.

location=~/Downloads
for file in $location/*.eml;
do
    echo $file
    name=${file##*/}
    noeml=${name%.eml}
    echo "$noml"
    mailparser -f $file -b > $location/$noeml.html
    x=$noeml.html
    wkhtmltopdf $location/$x $location/$noeml.pdf
done

The person posing the question ended up using CloudPull but the exploration and the fact that I figured it out for myself was sufficient for me to consider this project a success.

See the full source code