2009-05-19 3 views
6

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

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

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

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

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

+0

https: //gist.github .com/karlcow/5276813, похоже, содержит некоторый код неизвестного происхождения Python, который примерно соответствует тому, что находится в ответах ниже. – tripleee

ответ

3

Здесь приведено конвертер emlx2mbox в рубине: Mailbox Converter.

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

+0

Хотя это не документация по структурам данных, это, по крайней мере, функциональный исходный код +1 для шага в правильном направлении. :) –

+0

Код не дает никакого полезного результата? Argh! Мои глаза! Очки! Они ничего не делают !!! –

+0

Я подозреваю, что нет общедоступной документации emlx, так как каждый инструмент emlx, который я видел, указал, что они меняют формат. Если этот rb не работает, я думаю, вы получаете честь сделать лучшую версию. :) –

3

Еще несколько сведений, документирующих формат emlx.

message is composed:

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

XML-PLIST содержит certains код таких как

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

Привет, Карл! - Спасибо за вашу работу над этим - Но я не смог прочитать часть plist файла emlx. – DrLou

+0

Что вы пытаетесь сделать? Отправьте код где-нибудь. – karlcow

1

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

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

    } 

и там вы идете ....