Import From Apple Mail

Summary: Imports the selected or rule-processed messages from Apple Mail as .eml files.
Requires: EagleFiler
Install Location: ~/Library/Scripts/Applications/EagleFiler/

Description

The recommended way to import from Apple Mail is to select some messages and press the capture key. That will import the messages as a mailbox file. This script is for when you need to automate importing the selected messages or when you want to import the messages that are being processed by a Mail rule. Unlike when using the capture key, the messages are imported as individual .eml files, and the unread/flagged status and MailTags are not preserved. It’s also possible to modify the script to prompt you for options.

Download in Compiled Format · Download in Text Format

Script

on run
    
tell application "Mail"
        
if my isLionOrBetter() and (count of message viewers) is 1 then
            
-- If there's more than one, and full screen mode is active, we can't tell which is frontmost
            
return my importFromViewer(message viewer 1)
        
else
            
repeat with _viewer in message viewers
                
if index of _viewer's window is 1 then
                    
my importFromViewer(_viewer)
                
end if
            
end repeat
        
end if
    
end tell
end run

on isLionOrBetter()
    
tell application "Mail"
        
set AppleScript's text item delimiters to "."
        
set _versionString to version
        
set _major to (first text item of _versionString) as number
        
return _major ≥ 5
    
end tell
end isLionOrBetter

using terms from application "Mail"
    
on perform mail action with messages _messages
        
my importMessages(_messages)
    
end perform mail action with messages
end using terms from

on importFromViewer(_viewer)
    
tell application "Mail"
        
set _messages to (get selected messages of _viewer)
        
my importMessages(_messages)
    
end tell
end importFromViewer

on importMessages(_messages)
    
set _paths to {}
    
repeat with _message in _messages
        
tell application "Mail"
            
set _subject to subject of _message
            
set _source to source of _message
        
end tell
        
set _path to my createTempFolder() & "/" & my makeFileName(_subject)
        
my writeData(_path, _source)
        
copy _path to end of _paths
    
end repeat
    
tell application "EagleFiler"
        
import files _paths
    
end tell
end importMessages

on writeData(_path, _data)
    
set _file to POSIX file _path
    
set _fd to open for access _file with write permission
    
write _data to _fd
    
close access _fd
end writeData

on createTempFolder()
    
set _tempFolder to do shell script "mktemp -d -t 'EFImportAppleMail'"
    
return _tempFolder
end createTempFolder

on makeFileName(_subject)
    
set _clean to my replace(_subject, "/", ":")
    
set _clean to my replace(_clean, ":", "-")
    
set _extension to ".eml"
    
set _hfsPlusLimit to 255
    
set _max to _hfsPlusLimit - (length of _extension)
    
set _shortened to my substringToIndex(_clean, _max)
    
return _shortened & _extension
end makeFileName

on substringToIndex(_string, _index)
    
if length of _string > _index then
        
set _end to _index
    
else
        
set _end to length of _string
    
end if
    
return my join(characters 1 thru _end of _string, "")
end substringToIndex

on replace(_string, _source, _replacement)
    
return my join(my split(_string, _source), _replacement)
end replace

on join(_list, _sep)
    
set _temp to AppleScript's text item delimiters
    
set AppleScript's text item delimiters to _sep
    
set _result to _list as string
    
set AppleScript's text item delimiters to _temp
    
return _result
end join

on split(_string, _sep)
    
set _temp to AppleScript's text item delimiters
    
set AppleScript's text item delimiters to _sep
    
set _result to text items of _string
    
set AppleScript's text item delimiters to _temp
    
return _result
end split

Last Modified: 2012-01-06

Running the Script

You can use AppleScript Editor (AppleScript Utility prior to Mac OS X 10.6) to enable Mac OS X’s built-in Script menu. To run the script, just select it from the menu. FastScripts provides a similar menu that supports keyboard shortcuts and other features.