Documentação sobre estrutura de dados .emlx da Apple Mail (s) (para fins de conversão)?

votos
6

Esta parece ser uma jóia rara: onde encontrar documentação sobre a estrutura dos arquivos .emlx da Apple Mail (e suas variantes parciais, e o significado das estruturas de diretórios). Os médicos não parecem existir no site da Apple, nem posso encontrar qualquer menção razoável de que através do Google.

O ponto deste é a criação de um script bash / ruby ​​/ python / insert-script-langauge-aqui para converter uma bagunça desses arquivos em algo útil / flexível, como Maildir ou Mbox. O objetivo final é para migrar um instantâneo de loja / Library / Mail de um usuário em uma configuração Dovecot existente, que usa uma forma de Maildir.

Sim, estou ciente deste programa mas não aborda a solução que eu sou depois. Convertendo 20 caixas de correio com a mão e manualmente inseri-los em uma instalação existente vai exigir mais horas do que apenas escrever um script que digere as mensagens em outra coisa e depois armazená-los automaticamente onde deveriam estar. Nevermind que há potencialmente uma meia-dúzia de mais usuários que requerem este procedimento. Assim vale a pena o meu tempo para escrevê-lo para cima.

Por favor vote para fechar a duplicata de esta pergunta enquanto ele está em eliminação pendente, em vez de votar para esta pergunta para fechar. Por alguma razão, há falhas de postagem ocasionais ao usar Chrome como browser.

ACOMPANHAMENTO: Parece que o formato realmente não está documentada, e que a maioria das fontes engenharia reversa-lo. Se eu tiver tempo eu vou tentar fazê-lo minha auto; e se eu sou bem sucedido, vou postar um segundo follow-up com os detalhes de minhas descobertas.

Publicado 19/05/2009 em 19:56
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Um pouco mais informações documentando formato EMLX.

A mensagem é composta :

  • uma contagem de bytes para a mensagem na primeira linha
  • um depósito de MIME da mensagem
  • um plist XML

O plist XML contém código certains tais como

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

As bandeiras foram descritos por jwz e representa um número inteiro de 30 bits:

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)

Enviando-me uma mensagem simples e remover alguns detalhes, assim você pode ver a estrutura de dados cheio de emlxarquivos.

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>
Respondeu 30/03/2013 em 00:19
fonte usuário

votos
3

Aqui é um conversor emlx2mbox em ruby: Mailbox Converter .

Eu não acho que ele foi escrito a partir de qualquer documentação da especificação, mas sofreu várias atualizações, por isso espero que evoluíram para lidar com pelo menos algumas das peculiaridades do formato. O código-fonte é de cerca de 250 linhas de comprimento, e parece legível e bem comentado.

Respondeu 19/05/2009 em 20:12
fonte usuário

votos
1

Eu estou usando mailcore2 para analisar mensagens de .eml. Para fazer este trabalho com .emlx, eu só tinha que remover a primeira linha (que contém um número). A mensagem em si é equipado com o comprimento da mensagem para o bloco XML no final não precisa ser removido.

Aqui está como eu fiz isso em Objective-C / cacau (MCOMessageParser vem do quadro 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];

    }

E lá vai você ....

Respondeu 27/07/2013 em 13:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more