Документация по структуре данных Apple Mail .emlx (для целей конвертации)? - PullRequest
6 голосов
/ 19 мая 2009

Похоже, это редкая жемчужина: где найти документацию о структуре файлов Apple Mail .emlx (и их частичных вариантах, а также о значении структур каталогов). Документов не существует на сайте Apple, и я не могу найти разумного упоминания об этом через Google.

Смысл этого заключается в создании сценария bash / ruby ​​/ python / insert-script-langauge-here для преобразования беспорядка этих файлов в нечто пригодное для использования / гибкое, например Maildir или Mbox. Конечная цель - перенести снимок пользовательского / библиотечного / почтового хранилища в существующую настройку Dovecot, в которой используется форма Maildir.

Да, Мне известна эта программа , но она не относится к решению, которое я ищу. Преобразование 20 почтовых ящиков вручную и ручная вставка их в существующую установку потребует больше часов, чем просто написание сценария, который переваривает сообщения во что-то другое, а затем автоматически сохраняет их там, где они должны быть. Не имеет значения, что потенциально есть еще полдюжины пользователей, которым потребуется эта процедура. Так что стоит потратить время на написание сценария.

Проголосуйте, чтобы закрыть дубликат этого вопроса, пока он ожидает удаления, вместо того, чтобы голосовать за закрытие этого вопроса. По какой-то причине при использовании Chrome в качестве браузера иногда возникают проблемы с публикацией.

ПОСЛЕДУЮЩИЙ: Похоже, что формат на самом деле недокументирован, и что большинство источников его перепроектировали. Если у меня будет время, я постараюсь сделать это самостоятельно; и если я добьюсь успеха, я опубликую 2-е продолжение с подробностями моих выводов.

Ответы [ 3 ]

3 голосов
/ 30 марта 2013

Еще немного информации, документирующей формат emlx.

Сообщение состоит из :

  • счетчик байтов для сообщения в первой строке
  • MIME-дамп сообщения
  • XML-список

XML-список содержит определенный код, такой как

<?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>

Флаги были описаны 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 голосов
/ 19 мая 2009

Вот конвертер emlx2mbox в ruby: Конвертер почтовых ящиков .

Я не думаю, что он был написан из какой-либо документации спецификации, но он подвергся множественным обновлениям, так что, надеюсь, развился, чтобы справиться хотя бы с некоторыми из особенностей формата. Исходный код длиной около 250 строк выглядит хорошо читаемым и хорошо прокомментированным.

1 голос
/ 27 июля 2013

Я использую mailcore2 для разбора сообщений .eml. Чтобы это работало с .emlx, мне просто нужно было удалить первую строку (содержащую число). Само сообщение имеет длину сообщения, поэтому нет необходимости удалять блок XML в конце.

Вот как я это сделал в target-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];

    }

И вот, пожалуйста ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...