4kld
1/22/2018 - 10:05 PM

Create Day One Entry From Selected Message in Apple Mail (Requires Day One CLI)

Create Day One Entry From Selected Message in Apple Mail (Requires Day One CLI)

(*

Apple Mail to Markdown Formatted Day One Entry

!!! IMPORTANT !!!
Requires the Day One Command Line Interface. Download and install from here:
http://dayoneapp.com/tools/

Adapted from 'Apple Mail -- Text File Exporter w/ Basic Header Info' by Justin Lancy:
http://veritrope.com/code/apple-mail-export-to-text-file-w-basic-header-info



Adapted from the original script by Hans Erik Hazelhorst

http://veritrope.com/code/export-apple-mail-messages-and-notes-to-text-files

*)

property growlName : "MailToDayOne"
property appName : "Day One"
property successCount : "0"

(* CHECK FOR GROWL *)
tell application "System Events"
	set processnames to name of every process
end tell
if appIsRunning("GrowlHelperApp") then
	set isRunning to true
	tell application "GrowlHelperApp"
		set allNotificationsList to {"Success Notification", "Failure Notification"}
		set enabledNotificationsList to {"Success Notification", "Failure Notification"}
		register as application growlName all notifications allNotificationsList default notifications enabledNotificationsList icon of application appName
	end tell
end if

(*MAIN PROGRAM *)

(*TEMP FILES PROCESSED ON THE DESKTOP*)
tell application "Finder"
	if (the folder "Temp Export Folder" exists) then set FolderLoc to (the folder "Temp Export Folder")
	if not (the folder "Temp Export Folder" exists) then
		set FolderLoc to (make new folder at (path to desktop folder) with properties {name:"Temp Export Folder"})
	end if
	set SaveLoc to FolderLoc as string
end tell

(*APPLE MAIL ITEM SELECTION *)
tell application "Mail"
	try
		if (selection is not {}) then
			
			set theMessages to selection
			set msgnr to 1
			repeat with thisMessage in theMessages
				set recipientlist to (to recipients of thisMessage)
				
				(*Adding the Recipients in a separate variable  *)
				set theRecipients to "**To:** "
				repeat with CurrentRecipient in recipientlist
					set theRecipients to theRecipients & (address of CurrentRecipient) & "; " & (name of CurrentRecipient) as rich text
				end repeat
				
				(*...and also the cc-Recipients in a separate variable  *)
				set CcRecipientList to cc recipients of thisMessage
				set theCcRecipients to "**Cc:** "
				repeat with CurrentCCRecipient in CcRecipientList
					set theCcRecipients to theCcRecipients & (name of CurrentCCRecipient) & " (" & (address of CurrentCCRecipient) & "); " as rich text
				end repeat
				set myTitle to the subject of thisMessage
				set myContent to the content of thisMessage as string
				set messageMeat to (do shell script "echo " & (quoted form of myContent) & "")
				set ReplyAddr to the reply to of thisMessage
				set afzendername to extract name from sender of thisMessage
				set afzenderaddress to extract address from sender of thisMessage
				set EmailDate to the date received of thisMessage
				set theSource to the source of thisMessage
				set messageURL to the message id of thisMessage
				
				
				(*Custom header with some standard data  *)
				set CustomHeader to "## Email Message from " & afzendername & return & return & "[View Original Message](message://%3c" & messageURL & "%3e)" & return & return & "**Subject:** " & myTitle & return & "**From:** " & afzendername & " (" & afzenderaddress & ")" & return & "**Date:** " & EmailDate
				
				(*CLEAN TITLE FOR FILE *)
				set previousDelimiter to AppleScript's text item delimiters
				set potentialName to myTitle
				set legalName to {}
				set illegalCharacters to {".", ",", "/", ":", "[", "]"}
				repeat with thisCharacter in the characters of potentialName
					set thisCharacter to thisCharacter as rich text
					if thisCharacter is not in illegalCharacters then
						set the end of legalName to thisCharacter
					end if
				end repeat
				
				set AppleScript's text item delimiters to ""
				
				if length of legalName is greater than 32 then
					set legalName to items 1 thru 32 of legalName as rich text
				else
					set legalName to legalName as rich text
				end if
				
				set AppleScript's text item delimiters to previousDelimiter
				set theFileName to legalName
				
				(* Return Text *)
				set theText to messageMeat
				set theFilePath to (SaveLoc & msgnr & "_" & theFileName & ".txt")
				set msgnr to msgnr + 1
				--return CustomHeader & return & theRecipients & return & theCcRecipients & return & return & "---" & return & return & theText
				set DayOneEntry to CustomHeader & return & return & "---" & return & return & theText
				set successCount to successCount + 1
			end repeat
			
			(* GROWL *)
			
			if "GrowlHelperApp" is in processnames then
				tell application "GrowlHelperApp" -- GROWL SUCCESS
					notify with name ¬
						"Success Notification" title ¬
						"Mail to Day One" description "Successfully Exported Email with Subject: \"" & myTitle & "\" to Day One" application name growlName
				end tell
				set successCount to 0
			end if
		else if "GrowlHelperApp" is in processnames then
			tell application "GrowlHelperApp" -- GROWL FAILURE FOR NO SELECTION
				notify with name ¬
					"Failure Notification" title ¬
					"Export Failure" description ¬
					"No Messages or Notes Selected!" application name growlName
			end tell
		else if "GrowlHelperApp" is not in processnames then -- NON-GROWL ERROR MSG. FOR NO SELECTION
			display dialog "No Messages or Notes Selected!" with icon 0
		end if
		(* ERROR HANDLING *)
	on error errText number errNum
		if "GrowlHelperApp" is in processnames then
			tell application "GrowlHelperApp" -- GROWL FAILURE FOR ERROR
				notify with name ¬
					"Failure Notification" title ¬
					"Import Failure" description "Failed to export " & return & myTitle & ¬
					"\"  due to the following error: " & return & errText ¬
					application name growlName
			end tell
		else if "GrowlHelperApp" is not in processnames then -- NON-GROWL ERROR MSG. FOR ERROR
			display dialog "Item Failed to Export: " & errNum & return & errText with icon 0
		end if
		
	end try
end tell


(* SUBROUTINES *)

on appIsRunning(appName)
	tell application "System Events" to (name of processes) contains appName
end appIsRunning

--REPLACE SUBROUTINE
on replaceString(theString, theOriginalString, theNewString)
	set {od, AppleScript's text item delimiters} to {AppleScript's text item delimiters, theOriginalString}
	set theStringParts to text items of theString
	if (count of theStringParts) is greater than 1 then
		set theString to text item 1 of theStringParts as string
		repeat with eachPart in items 2 thru -1 of theStringParts
			set theString to theString & theNewString & eachPart as string
		end repeat
	end if
	set AppleScript's text item delimiters to od
	return theString
end replaceString

do shell script "echo \"" & DayOneEntry & "\" | /usr/local/bin/dayone -d=\"" & EmailDate & "\" new"