2009-05-19 6 views
6

이것은 Apple Mail의 .emlx 파일 (및 부분 변형 및 디렉토리 구조의 의미)의 구조에 대한 문서를 찾는 위치가 드문 보석입니다. 워드 프로세서는 애플의 사이트에 존재하지 않거나 구글을 통해 합리적인 언급을 찾을 수 없다.Apple Mail의 .emlx 데이터 구조에 관한 문서 (변환 목적)?

이 파일의 엉망진창을 Maildir 또는 Mbox와 같이 사용 가능/유연한 것으로 변환하기위한 bash/ruby ​​/ python/insert-script-langauge-here 스크립트를 만드는 것이 핵심입니다. 궁극적 인 목표는 사용자/라이브러리/메일 저장소의 스냅 샷을 Maildir 형식을 사용하는 기존 Dovecot 설정으로 마이그레이션하는 것입니다.

예, I am aware of this program 예를 들어, 제가 해결할 해결책을 제시하지 않았습니다. 20 개의 편지함을 손으로 변환하고 수동으로 기존 설치에 삽입하면 메시지를 다른 것으로 요약 한 스크립트를 작성한 다음 자동으로 저장해야하는 시간보다 더 많은 시간이 소요됩니다. 이 절차를 수행 할 사용자가 잠재적으로 6 명 이상 있다는 것을 염두에 두지 마십시오. 그래서 그것을 스크립팅 할 가치가 있습니다.

이 질문에 투표하는 대신 삭제가 보류 중일 때이 질문의 사본을 닫으려면 투표하십시오. 어떤 이유로 Chrome을 브라우저로 사용할 때 간혹 게시 오류가 발생합니다.

추종 : 형식이 실제로 문서화되지 않았으며 대부분의 출처에서 리버스 엔지니어링 한 것처럼 보입니다. 시간이 있다면 나는 내 자신을 그렇게하려고 시도 할 것이다. 내가 성공하면 내 결과의 세부 사항에 대한 2 차 후속 조치를 게시 할 것입니다.

+0

은 https : //gist.github .com/karlcow/5276813 아래에있는 답변을 대략적으로 구현 한 알려지지 않은 출처의 파이썬 코드가 포함되어있는 것 같습니다. – tripleee

답변

3

다음은 루비의 emlx2mbox 변환기입니다. Mailbox Converter.

필자는 스펙의 모든 문서에서 작성된 것은 아니지만 여러 개의 업데이트를 거쳤으므로 형식 중 일부 이상을 처리하도록 진화 한 것으로 보입니다. 소스 코드는 약 250 줄이며, 읽기 쉽고 주석이 잘 보입니다.

+0

데이터 구조에 대한 문서가 아니지만 적어도 기능적 소스 코드입니다. 올바른 방향의 한 단계는 +1입니다. :) –

+0

코드가 사용 가능한 출력을 생성하지 않습니까? 아! 내 눈! 고글들! 그들은 아무 일도하지 않습니다 !!! –

+0

필자가 본 모든 emlx 도구는 형식을 리버스 엔지니어링 한 것으로 나타 났으므로 emlx에 대한 공개 문서가 없다고 생각합니다. 이 rb가 작동하지 않으면 더 나은 버전을 만드는 영광을 얻습니다. :) –

3

emlx 형식을 설명하는 몇 가지 추가 정보.

message is composed :

  • 메시지
  • 는 XML을 plist

의 MIME 덤프가 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> 

jwz에 의한 flags have been described 및 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

안녕하세요! - 이것에 감사드립니다 -하지만 emlx 파일의 plist 부분을 읽을 수 없었습니다. – DrLou

+0

당신은 무엇을하려고 했습니까? 코드를 어딘가에 게시하십시오. – karlcow

1

mailcore2를 사용하여 .eml 메시지를 구문 분석합니다. .emlx로이 작업을하려면, 첫 행 (숫자가 들어있는 행)을 제거해야했습니다.메시지 자체에는 메시지 길이가 있으므로 마지막에있는 XML 블록을 제거 할 필요가 없습니다. 내가 목표 - 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]; 

    } 

와 ....