2009-05-19 15 views
6

यह एक दुर्लभ रत्न प्रतीत होता है: ऐप्पल मेल की .emlx फ़ाइलों (और उनके आंशिक रूपों, और निर्देशिका संरचनाओं का अर्थ) की संरचना पर दस्तावेज़ कहां खोजें। दस्तावेज़ एप्पल की साइट पर मौजूद नहीं दिखते हैं, न ही मुझे Google के माध्यम से इसका कोई उचित उल्लेख मिल सकता है।ऐप्पल मेल की .emlx डेटा संरचना (रूपांतरण उद्देश्यों के लिए) पर दस्तावेज़ीकरण?

इसका बिंदु मेलशिर या एमबॉक्स जैसे कुछ उपयोग करने योग्य/व्यवहार्य रूप से इन फ़ाइलों की गड़बड़ी को बदलने के लिए एक बैश/रूबी/पायथन/डालने-स्क्रिप्ट-लैंगेज-स्क्रिप्ट स्क्रिप्ट का निर्माण है। अंतिम लक्ष्य किसी उपयोगकर्ता के/लाइब्रेरी/मेल स्टोर के स्नैपशॉट को मौजूदा डोवकोट सेटअप में माइग्रेट करना है, जो मेलडिर का एक रूप उपयोग करता है।

हां, I am aware of this program लेकिन यह मेरे बाद के समाधान को संबोधित नहीं करता है। 20 मेलबॉक्सों को हाथ से परिवर्तित करना और मैन्युअल रूप से उन्हें मौजूदा इंस्टॉलेशन में डालने के लिए किसी स्क्रिप्ट को लिखने से अधिक घंटे की आवश्यकता होगी जो संदेश को किसी अन्य चीज़ में पचता है और फिर उन्हें स्वचालित रूप से संग्रहीत करता है जहां उन्हें होना चाहिए। यह न मानें कि संभावित रूप से आधा दर्जन अधिक उपयोगकर्ता हैं जिन्हें इस प्रक्रिया की आवश्यकता होगी। तो यह स्क्रिप्ट करने के लिए मेरे समय के लायक है।

कृपया इस प्रश्न के बंद होने के बजाय मतदान के लंबित होने पर इस प्रश्न के डुप्लिकेट को बंद करने के लिए वोट दें। कुछ कारणों से, ब्राउजर के रूप में क्रोम का उपयोग करते समय कभी-कभी पोस्टिंग ग्लिच होते हैं।

फ़ॉलो-अप: ऐसा प्रतीत होता है कि प्रारूप वास्तव में अनियंत्रित है, और अधिकांश स्रोतों ने इसे रिवर्स-इंजीनियर किया है। यदि मेरे पास समय है तो मैं ऐसा करने का प्रयास करूंगा; और यदि मैं सफल हूं, तो मैं अपने निष्कर्षों के विवरण के साथ दूसरा अनुवर्ती पोस्ट करूंगा।

+0

https: //gist.github .com/karlcow/5276813 में अज्ञात उद्भव के कुछ पायथन कोड शामिल हैं जो नीचे दिए गए उत्तरों में मोटे तौर पर लागू होते हैं। – tripleee

उत्तर

3

रूबी में एक emlx2mbox कनवर्टर है: Mailbox Converter

मुझे नहीं लगता कि यह spec के किसी दस्तावेज़ से लिखा गया था, लेकिन इसमें कई अपडेट हुए हैं, इसलिए उम्मीद है कि प्रारूप के कम से कम कुछ कर्कों को संभालने के लिए विकसित किया गया है। स्रोत कोड लगभग 250 लाइन लंबा है, और यह पठनीय और अच्छी तरह से टिप्पणी करता है।

+0

हालांकि यह डेटा संरचनाओं पर प्रलेखन नहीं है, यह कम से कम कार्यात्मक स्रोत कोड है, सही दिशा में एक चरण के लिए +1 है। :) –

+0

कोड किसी भी उपयोगी आउटपुट का उत्पादन नहीं करता है? अरे! मेरी आँखें! चश्मा! वे कुछ नहीं करते !!! –

+0

मुझे संदेह है कि एमएमएलएक्स का कोई सार्वजनिक दस्तावेज नहीं है, क्योंकि मैंने देखा है कि प्रत्येक एमएलएक्स उपकरण ने संकेत दिया है कि वे प्रारूप को इंजीनियर करते हैं। यदि यह आरबी काम नहीं करता है, तो मुझे लगता है कि आपको बेहतर संस्करण बनाने का सम्मान मिलता है। :) –

3

एमएलएक्स प्रारूप दस्तावेज करने वाली कुछ और जानकारी।

message is composed:

  • पहली पंक्ति पर संदेश के लिए एक बाइट गिनती
  • संदेश
  • एक एक्सएमएल plist

की एक माइम डंप एक्सएमएल 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

हैलो कार्ल! - इस पर आपके काम के लिए धन्यवाद - लेकिन मैं एक एमएलएक्स फ़ाइल के प्लेस्ट हिस्से को पढ़ने में असमर्थ रहा हूं। – DrLou

+0

आपने क्या करने की कोशिश की? कहीं कोड पोस्ट करें। – karlcow

1

मैं मेल संदेशों को पार्स करने के लिए मेलकोर 2 का उपयोग कर रहा हूं। इस काम को .emlx के साथ बनाने के लिए, मुझे बस पहली पंक्ति (एक संख्या युक्त) को हटाना पड़ा।संदेश स्वयं संदेश की लंबाई से लैस है, इसलिए अंत में एक्सएमएल ब्लॉक को हटाने की आवश्यकता नहीं है।

यहाँ है मैं कैसे यह उद्देश्य-सी/कोको में किया था (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]; 

    } 

और वहाँ तुम जाओ ....