Nicholas Lindley

I have really been having good luck using OmniFocus and Getting Things Done to keep my life in order. One thing I like that OmniFocus provides out of the box is a way to automatically process email sent to a specific address and add it to OmniFocus. I have even provided this address to family and friends so they can automatically add tasks for me to review. Whether or not you want others to have this ability is a different question.

However, sometimes there are emails that I want added to my OmniFocus Inbox that come from other places, and I was not able to find an easy way to do that. I really had few requirements:

  • The subject was used as the task name.
  • The note contained a link to the original email message.
  • The message would be moved to my “Archive” folder.

I could have chosen to include the contents of the message in the note field, but a link seemed easier because there could be attachments, long signatures, an entire thread, etc. My solution was to create a service in Automator that uses a simple AppleScript.

The quickest way to get going is to clone the script into ~/Library/Services:

git clone ~/Library/Services/Send\ to\ OmniFocus\ and\ Archive.workflow

You can then highlight the messages in Mail that you would like to send to OmniFocus, click on Mail in the top-left of the system menu, go to Services, and click Send to OmniFocus and Archive. Since I don’t like using a mouse much of the time, I created a keyboard shortcut in System Preferences.

The entirety of the AppleScript is below.

on run {input, parameters}

    tell application "Mail"
        set theSelection to selection
        set DestinationFolderName to "Archive"

        repeat with theMessage in theSelection
            set theSubject to the subject of theMessage
            set theURL to "message://%3c" & theMessage's message id & "%3e"

            tell application "OmniFocus" to tell default document
                make new inbox task with properties {name:theSubject, note:theURL}
            end tell

            set theAccount to account of mailbox of theMessage
            if name of every mailbox of theAccount contains DestinationFolderName then
                set archiveFolder to mailbox DestinationFolderName of theAccount
                move theMessage to archiveFolder
            end if

        end repeat
    end tell

    return input
end run