Mailsmith Hierarchical Export Script

If you’ve been following the conversation here (or over on HawkWings), you’ll note that one of my biggest concerns with having all my mail *in* Mailsmith was that I couldn’t easily get it all *out*, especially not while preserving the hierarchy of messages. That’s no longer a concern, thanks to a little bit of AppleScript mojo, a few hours of “free” time, and the seeds planted by BareBones flat-export script. With great fanfare, but clearly no guarantees, representations, or warrantees by the author or anyone else, I present to you my Mailsmith Hierarchical Export Script (I’ve pasted it here “in the open” so folks searching will have a better chance of finding it, though WordPress doesn’t make this easy. Any advice is welcomed).

-- This script is an enhancement of the BareBones-published
-- Mailsmith Export script.  BareBones' script leaves all the mbox files in
-- one directory, whereas this now creates a folder hierarchy
-- that matches the hierarchy within Mailsmith.
-- Note that the author of the modifications makes no guarantees that
-- this won't completely corrupt your mail store and render it more
-- useless than a leftover chicken.

global export_folder

on doTask(mbox)
tell application "Mailsmith"

set pathadd to ""
set unix_folder to ""

set mboxpath to path of mbox
set pathlength to length of mboxpath

-- Check to see if we're down one or more levels.
-- If so, fill 'pathadd' with the appropriate hierarchy.
-- Since Mailsmith uses the colon ':' to separate folder names,
-- we'll convert slashes to colons in the process.

if pathlength > 0 then
repeat with i from 2 to (pathlength)
if (item i of mboxpath = "/") then
set pathadd to pathadd & ":"
else
set pathadd to pathadd & item i of mboxpath
end if
end repeat
set pathadd to pathadd & ":"
end if

set full_folder to (export_folder as string) & pathadd

-- Now we'll use the Finder to see if the destination folder exists.
-- If it does, do nothing.  If not, we gotta create it.

tell application "Finder"
if folder full_folder exists then
else

-- Now we need to convert *all* of the colons back to
-- slashes since we'll be using unix's 'mkdir -p' command
-- to create the subdirectory

repeat with l from 1 to length of full_folder
if (item l of full_folder = ":") then
set unix_folder to unix_folder & "/"
else
set unix_folder to unix_folder & item l of full_folder
end if
end repeat

set mkdirStr to "mkdir -p '/Volumes/" & unix_folder & "'"

-- Of course, since Mailsmith lets us store both messages AND
-- folders within the same mailbox, it's entirely possible that
-- we'll have a mailbox with both.  When exporting as mbox files,
-- that situation is impossible, and the creation of the folder
-- will fail since the mbox file of the same name will be created first.
-- However, since everything else will want to be in that folder, the folder 'wins'
-- rights to the name.  In that case, rename the mbox to '{name} - mailbox'
-- and then create the folder

try
do shell script mkdirStr
on error errText
if (errText contains "File exists") then
set unix_filename to ""

-- Strip the trailing slash from the folder name.
-- Yes, I'm sure there's a more efficient way to do this.

repeat with g from 1 to ((length of unix_folder) - 1)
set unix_filename to unix_filename & item g of unix_folder
end repeat

-- rename the file

set mvStr to "mv '/Volumes/" & unix_filename & "' '/Volumes/" & unix_filename & " - mailbox'"
do shell script mvStr
end if

-- Now create the subdirectory.  If it doesn't work this time, let the script die.

do shell script mkdirStr

end try
end if
end tell

-- increase the timeout while exporting since 180 seconds isn't nearly enough for larger mailboxes

with timeout of 3600 seconds
export mbox to full_folder as alias
end timeout

end tell
end doTask

on run
tell application "Mailsmith"
set export_folder to choose folder with prompt ¬
"Choose a folder to export mailboxes into."
set ct to count mailboxes
repeat with i from 1 to ct
set obj to mailbox i
my process_mailbox(obj)
end repeat
end tell
end run

on process_mailbox(mbox)
tell application "Mailsmith"

-- Skip creating an empty mailbox for each folder (but, of course
-- still export if mailbox contains both messages and mailboxes)

if not (((count mailboxes of mbox) > 0) and ((count messages of mbox) = 0)) then
my doTask(mbox)
end if

set ct to count mailboxes of mbox
repeat with i from 1 to ct
set obj to mailbox i of mbox
my process_mailbox(obj)
end repeat
end tell
end process_mailbox

But the question remains… where (if anywhere) do I put it? Mail.app *also* seems to limit ones ability to export (to anything!)… if that’s the case, well, I ain’t going there! Oh this is a joy.

Technorati Tags: , , ,