2009-05-19 18 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]; 

    } 

而且你去那里....