2009-05-19 8 views
6

Ésta parece ser una joya: dónde encontrar documentación sobre la estructura de archivos de Apple .emlx de correo (y sus variantes parciales, y el significado de las estructuras de directorios). Los documentos no parecen existir en el sitio de Apple, ni puedo encontrar ninguna mención razonable a través de Google.Documentación en las estructuras de datos .emlx de Apple Mail (para fines de conversión)?

El punto de esto es la creación de un script bash/ruby ​​/ python/insert-script-langauge-here para convertir un desorden de estos archivos en algo utilizable/flexible, como Maildir o Mbox. El objetivo final es migrar una instantánea de la tienda de/Library/Mail de un usuario a una configuración existente de Dovecot, que utiliza una forma de Maildir.

Sí, I am aware of this program pero no aborda la solución que busco. La conversión de 20 buzones a mano y de forma manual insertarlos en una instalación existente requerirá más horas que acaba de escribir un guión que digiere los mensajes en otra cosa y luego almacenar automáticamente donde deben estar. No importa que haya potencialmente media docena más usuarios que requerirán este procedimiento. Así que vale la pena mi tiempo para guiarlo.

Por favor, vote para cerrar el duplicado de esta pregunta mientras está pendiente la eliminación, en lugar de votar para que esta pregunta se cierre. Por alguna razón, hay problemas técnicos ocasionales al usar Chrome como navegador.

SEGUIMIENTO: Parece que el formato realmente no está documentado, y que la mayoría de las fuentes lo han modificado por ingeniería inversa. Si tengo tiempo, intentaré hacerlo por mí mismo; y si tengo éxito, publicaré un segundo seguimiento con los detalles de mis hallazgos.

+0

https: //gist.github .com/karlcow/5276813 parece contener algún código Python de origen desconocido que implementa más o menos lo que está en las respuestas a continuación. – tripleee

Respuesta

3

Aquí es un convertidor emlx2mbox en rubí: Mailbox Converter.

no creo que fue escrito desde cualquier documentación de la especificación, pero ha sufrido varias actualizaciones, así que espero que evolucionaron para manejar al menos algunas de las peculiaridades del formato. El código fuente tiene alrededor de 250 líneas y parece legible y bien comentado.

+0

Si bien no es documentación sobre las estructuras de datos, es al menos código fuente funcional, +1 para un paso en la dirección correcta. :) –

+0

¿El código no produce ningún resultado utilizable? Argh! ¡Mis ojos! ¡Las gafas! ¡¡¡Ellos no hacen nada!!! –

+0

Sospecho que no hay documentación pública de emlx, ya que cada herramienta emlx que he visto ha indicado que revertieron la ingeniería del formato. Si este rb no funciona, supongo que tienes el honor de hacer una mejor versión. :) –

3

Un poco más información que documenta formato EMLX.

El message is composed:

  • una cuenta de bytes para el mensaje en la primera línea
  • un vertedero MIME del mensaje
  • un plist XML

PLIST XML contiene código certains tales 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> 

El flags have been described por JWZ y representa un número entero 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) 

Envío de un mensaje simple a mí mismo y la eliminación de algunos detalles, para que pueda ver la estructura de datos completa de los archivos 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> 
+0

¡Hola Karl! - Gracias por tu trabajo en esto - Pero no he podido leer la parte plist de un archivo emlx. – DrLou

+0

¿Qué trataste de hacer? Publica el código en alguna parte. – karlcow

1

Estoy usando mailcore2 para analizar mensajes .eml. Para que esto funcione con .emlx, solo tuve que eliminar la primera línea (que contiene un número).El mensaje en sí está equipado con la longitud del mensaje, por lo que no es necesario eliminar el bloque XML al final.

Aquí es cómo lo hice en Objective-C/cacao (MCOMessageParser viene del marco 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]; 

    } 

Y hay que ir ....

Cuestiones relacionadas