2009-05-19 46 views
6

這似乎是一個罕見的寶石:在哪裏可以找到關於Apple Mail的.emlx文件(及其部分變體,以及目錄結構的含義)結構的文檔。這些文檔似乎並不存在於Apple的網站上,我也不能通過Google找到任何合理的提及。有關Apple Mail的.emlx數據結構(用於轉換目的)的文檔?

這個問題的關鍵是創建一個bash/ruby​​/python/insert-script-langauge-here腳本來將這些文件混合成一些可用/易用的東西,比如Maildir或Mbox。最終目標是將用戶/庫/郵件存儲的快照遷移到現有的Dovecot設置中,該設置使用Maildir形式。

是的,I am aware of this program但它沒有解決我之後的解決方案。手動轉換20個郵箱並手動將它們插入到現有安裝中需要更多的時間,而不僅僅是編寫一個將消息解析爲其他內容的腳本,然後自動將它們存儲在應該存儲的位置。不要忘記,有可能會有更多的用戶需要這個過程。所以值得我花時間來編寫它。

請投票結束此問題正在等待刪除時的副本,而不是投票結束此問題。出於某種原因,Chrome在瀏覽器中偶爾會發生故障。

後續行動:看起來這個格式確實沒有文檔,而且大多數消息來源都是反向設計的。如果我有時間,我會嘗試這樣做我的自我;如果我成功了,我會發布第二次後續跟蹤結果的細節。

+0

HTTPS://gist.github .com/karlcow/5276813似乎包含一些不明來源的Python代碼,它大致實現了下面答案中的內容。 – tripleee 2016-01-11 06:41:00

回答

3

這裏是一個紅寶石emlx2mbox轉換器:Mailbox Converter

我不認爲它是從規範的任何文檔寫入的,但它經歷了多次更新,所以希望能夠演化來處理至少一些格式的怪癖。源代碼大約250行,看起來很可讀,並且評論得很好。

+0

儘管它不是關於數據結構的文檔,但它至少是功能性源代碼,正確方向的步驟爲+1。 :) – 2009-05-19 19:18:27

+0

該代碼不會產生任何可用的輸出?哎呀!我的眼睛!護目鏡!他們什麼都不做! – 2009-05-19 19:56:09

3

更多信息記錄emlx格式。

message is composed

  • 字節計數爲消息在第一行
  • 消息
  • 一個XML plist中

的MIME轉儲的XML plist中包含某些碼碼如

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>date-sent</key> 
     <real>1362211252</real> 
     <key>flags</key> 
     <integer>8590195713</integer> 
     <key>original-mailbox</key> 
     <string>imap://****@127.0.0.1:143/mail/2013/03</string> 
     <key>remote-id</key> 
     <string>252</string> 
     <key>subject</key> 
     <string>Re: Foobar</string> 
</dict> 

flags have been described通過JWZ和代表30位整數:

0  read      1 << 0 
1  deleted     1 << 1 
2  answered     1 << 2 
3  encrypted     1 << 3 
4  flagged     1 << 4 
5  recent     1 << 5 
6  draft      1 << 6 
7  initial (no longer used) 1 << 7 
8  forwarded     1 << 8 
9  redirected    1 << 9 
10-15 attachment count   3F << 10 (6 bits) 
16-22 priority level   7F << 16 (7 bits) 
23  signed     1 << 23 
24  is junk     1 << 24 
25  is not junk    1 << 25 
26-28 font size delta   7 << 26 (3 bits) 
29  junk mail level recorded 1 << 29 
30  highlight text in toc  1 << 30 
31  (unused) 

自己發送一個簡單的消息,並刪除了一些細節,所以你可以看到的emlx文件的完整數據結構。

875  
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on ******.*********.*** 
X-Spam-Level: 
X-Spam-Status: No, score=-3.2 required=4.2 tests=BAYES_00,RP_MATCHES_RCVD, 
     SPF_PASS,TVD_SPACE_RATIO autolearn=ham version=3.3.2 
Received: from [127.0.0.1] (******.*********.*** [***.**.**.**]) 
     by ******.*********.*** (8.14.5/8.14.5) with ESMTP id r2TN8m4U099571 
     for <****@*********.***>; Fri, 29 Mar 2013 19:08:48 -0400 (EDT) 
     (envelope-from ****@*********.***) 
Subject: very simple 
From: Karl Dubost <****@*********.***> 
Content-Type: text/plain; charset=us-ascii 
Message-Id: <[email protected]*********.***> 
Date: Fri, 29 Mar 2013 19:09:06 -0400 
To: Karl Dubost <****@*********.***> 
Content-Transfer-Encoding: 7bit 
Mime-Version: 1.0 (Apple Message framework v1283) 
X-Mailer: Apple Mail (2.1283) 

message Foo 
-- 
Karl Dubost 
http://www.la-grange.net/karl/ 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>date-sent</key> 
     <real>1364598546</real> 
     <key>flags</key> 
     <integer>8590195713</integer> 
     <key>original-mailbox</key> 
     <string>imap://********@127.0.0.1:11143/mail/2013/03</string> 
     <key>remote-id</key> 
     <string>41147</string> 
     <key>subject</key> 
     <string>very simple</string> 
</dict> 
</plist> 
1

我正在使用mailcore2來解析.eml消息。爲了使這個工作與.emlx,我只需要刪除第一行(包含一個數字)。消息本身配有消息的長度,因此不需要刪除末尾的XML塊。

這是我如何在Objective-C /可可做到了​​(MCOMessageParser來自mailcore2框架):

-(Documents *)ParseEmlMessageforPath: (NSString*)fullpath filename:(NSString*)filename{ 
NSLog(@"fullpath = %@", fullpath); 
NSError * error; 
error = nil; 
NSData *fileContents = [NSData dataWithContentsOfFile:fullpath options:NSDataReadingMappedIfSafe error:&error]; 
if (error) { 
    [[NSApplication sharedApplication] presentError:error]; 
} 
MCOMessageParser * parser; 
if (fileContents) { 
    if ([[fullpath pathExtension] isEqualToString:@"emlx"]) { 
     NSData * linefeed = [(NSString*)@"\n" dataUsingEncoding:NSUTF8StringEncoding ]; 
     NSInteger filelength = [fileContents length]; 
     NSRange xx = NSMakeRange(0, 20); 
     NSRange pos = [fileContents rangeOfData:linefeed options:0 range:xx] ; 
     if (pos.location != NSNotFound) { 
      NSData *subcontent = [fileContents subdataWithRange:(NSRange){pos.location+1, filelength-(pos.location)-1}]; 
      parser = [MCOMessageParser messageParserWithData:subcontent]; 
     } else { 
      return nil; 
     } 

    } else { 
     parser = [MCOMessageParser messageParserWithData:fileContents]; 

    } 

而且你去那裏....