代码之家  ›  专栏  ›  技术社区  ›  Avery Payne

有关Apple Mail.emlx数据结构的文档(用于转换)?

  •  6
  • Avery Payne  · 技术社区  · 16 年前

    这似乎是一块罕见的宝石:在哪里可以找到关于Apple Mail的.emlx文件结构(及其部分变体,以及目录结构的含义)的文档。这些文档似乎并不存在于苹果的网站上,我也无法通过谷歌找到任何合理的提及。

    重点是创建一个bash/ruby/python/insert脚本langauge-here脚本,将这些文件的混乱部分转换为可用/易受影响的内容,比如maildir或mbox。最终目标是将用户/库/邮件存储的快照迁移到使用maildir形式的现有dovecot设置中。

    对, I am aware of this program 但这并不能解决我所追求的解决方案。手动转换20个邮箱并手动将其插入现有安装中需要花费比只编写一个脚本(将消息消化为其他内容,然后自动将其存储到应该的位置)更长的时间。不要担心可能会有更多的用户需要这个过程。所以值得我花时间编写脚本。

    请投票关闭此问题的副本,而不是投票关闭此问题。出于某种原因,当使用Chrome作为浏览器时,偶尔会出现一些张贴错误。

    后续工作:看起来这个格式实际上是没有文档记录的,而且大多数来源都对它进行了逆向工程。如果我有时间,我会尝试自己去做;如果我成功了,我会发布第二个跟进,详细介绍我的发现。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Matt G    16 年前

    这里是一个emlx2mbox转换器,采用Ruby语言: Mailbox Converter .

    我不认为它是从规范的任何文档中编写的,但是它已经经历了多次更新,所以我希望它至少能够处理一些格式上的奇怪之处。源代码大约有250行长,看起来可读并且注释性很好。

        2
  •  3
  •   karlcow    12 年前

    记录emlx格式的更多信息。

    这个 message is composed :

    • 第一行消息的字节计数
    • 邮件的mime转储
    • XML PLIST

    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: <4E83618E-BB56-404F-8595-87352648ADC7@*********.***>
    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>
    
        3
  •  1
  •   olekeh    8 年前

    我正在使用mailcore2解析.eml消息。为了使用.emlx,我只需要删除第一行(包含一个数字)。消息本身配备了消息的长度,因此不需要删除末尾的XML块。

    以下是我在objective-c/cocoa中的做法(mcomeMessageParser来自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];
    
        }
    

    就这样……