Apple Mail 的 .emlx 数据结构的文档(用于转换目的)?
Posted
技术标签:
【中文标题】Apple Mail 的 .emlx 数据结构的文档(用于转换目的)?【英文标题】:Documentation on Apple Mail's .emlx data structure(s) (for conversion purposes)? 【发布时间】:2010-10-27 10:24:12 【问题描述】:这似乎是一个稀有的宝石:在哪里可以找到有关 Apple Mail 的 .emlx 文件结构(及其部分变体,以及目录结构的含义)的文档。 Apple 网站上似乎不存在这些文档,我也无法通过 Google 找到任何合理的提及。
这里的重点是创建一个 bash/ruby/python/insert-script-langauge-here 脚本来将这些文件的混乱转换成可用/可弯曲的东西,比如 Maildir 或 Mbox。最终目标是将用户 /Library/Mail 存储的快照迁移到使用 Maildir 形式的现有 Dovecot 设置中。
是的,I am aware of this program,但它没有解决我所追求的解决方案。手动转换 20 个邮箱并手动将它们插入到现有安装中,将需要更多的时间,而不仅仅是编写一个脚本,将消息消化成其他内容,然后自动将它们存储在应有的位置。没关系,可能还有六个用户需要此过程。所以值得我花时间编写脚本。
请在此问题待删除时投票关闭该问题的副本,而不是投票关闭该问题。出于某种原因,在使用 Chrome 作为浏览器时偶尔会出现发布故障。
跟进:该格式似乎确实没有记录,并且大多数来源都对其进行了逆向工程。如果我有时间,我会自己尝试这样做;如果我成功了,我将发布第二次跟进,其中包含我的发现的详细信息。
【问题讨论】:
gist.github.com/karlcow/5276813 似乎包含一些来源不明的 Python 代码,大致实现了以下答案中的内容。 【参考方案1】:这是一个 ruby 中的 emlx2mbox 转换器:Mailbox Converter。
我不认为它是根据规范的任何文档编写的,但它经历了多次更新,因此希望至少能够处理格式的一些怪癖。源代码长约 250 行,看起来可读且注释良好。
【讨论】:
虽然它不是关于数据结构的文档,但它至少是功能性源代码,+1 是朝着正确方向迈出的一步。 :) 代码没有产生任何可用的输出?啊!我的眼睛!护目镜!他们什么都不做!!! 我怀疑没有关于 emlx 的公开文档,因为我见过的每个 emlx 工具都表明他们对格式进行了逆向工程。如果这个 rb 不起作用,我猜你有幸做出更好的版本。 :) 看起来这就是我所在的位置。但是感谢您至少发布了一个可以解决此问题的工具。据我所知,有一个数字指示符(大小?)、消息,最后是一些 XML 标记。我怀疑修剪 XML、丢弃数字并保存其余部分可能会奏效。【参考方案2】:更多关于 emlx 格式的信息。
message is composed:
第一行消息的字节数 邮件的 MIME 转储 一个 XML plistXML 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 by 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>
【讨论】:
卡尔你好! - 感谢您为此所做的工作 - 但我无法读取 emlx 文件的 plist 部分。【参考方案3】:我正在使用 mailcore2 来解析 .eml 消息。要使用 .emlx 进行这项工作,我只需要删除第一行(包含一个数字)。消息本身配备了消息的长度,所以末尾的 XML 块不需要删除。
这是我在objective-c/cocoa中的做法(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];
你去吧....
【讨论】:
【参考方案4】:截至 2020 年,Python 拥有轻量级的 emlx library。
pip install emlx
然后
>>> import emlx
>>> m = emlx.read("12345.emlx")
>>> m.headers
'Subject': 'Re: Emlx library ✉️',
'From': 'Michael <michael@example.com>',
'Date': 'Thu, 30 Jan 2020 20:25:43 +0100',
'Content-Type': 'text/plain; charset=utf-8',
...
>>> m.headers['Subject']
'Re: Emlx library ✉️'
>>> m.plist
'color': '000000',
'conversation-id': 12345,
'date-last-viewed': 1580423184,
'flags': ...,
...
>>> m.flags
'read': True, 'answered': True, 'attachment_count': 2
【讨论】:
【参考方案5】:原来的 emlx2mbox ruby 脚本是很久以前写的。我已经更新它以在现代 ruby 环境下运行。请查看https://github.com/imdatsolak/elmx2mbox
【讨论】:
以上是关于Apple Mail 的 .emlx 数据结构的文档(用于转换目的)?的主要内容,如果未能解决你的问题,请参考以下文章