2012-02-01 34 views
0

我試圖解析MIME郵件,使用SharpMimeToolsHunny Software的一些示例Mime消息。我設法從一個文件創建一個新的消息,並將解碼後的文件保存到一個文件(這是一個PNG圖像),但創建的文件已損壞。大部分示例文件和我所討論的示例文件看起來都是一樣的,但有差異。使用anmar.SharpMimeTools解析MIME郵件

這些文件可以在這裏找到:

文件的十六進制視圖的摘錄:
原文:

89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 
00 00 00 1b 00 00 00 1b 08 03 00 00 00 ba 0a 04 
67 00 00 03 00 50 4c 54 45 ff ff ff 00 00 08 00 
00 10 00 00 18 00 00 00 00 08 29 00 10 42 00 10 
4a 00 08 31 00 10 52 08 21 73 08 29 7b 08 29 84 
08 21 6b 00 18 5a 00 08 39 08 21 63 10 39 9c 18 
42 a5 18 42 ad 18 42 b5 10 39 a5 10 31 94 00 18 

提取:

3f 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 
00 00 00 1b 00 00 00 1b 08 03 00 00 00 3f 0a 04 
67 00 00 03 00 50 4c 54 45 3f 3f 3f 00 00 08 00 
00 10 00 00 18 00 00 00 00 08 29 00 10 42 00 10 
4a 00 08 31 00 10 52 08 21 73 08 29 7b 08 29 3f 
08 21 6b 00 18 5a 00 08 39 08 21 63 10 39 3f 18 
42 3f 18 42 3f 18 42 3f 10 39 3f 10 31 3f 00 18 

...最後,這是我使用的代碼:

public void MIMETest() 
{ 
    FileStream fileStream = new FileStream(@"D:\m0013.txt", FileMode.Open); 
    SharpMimeMessage m = new SharpMimeMessage(fileStream); 
    fileStream.Close(); 
    parseMessage(m);    
} 

public void parseMessage(SharpMimeMessage message) 
{ 
    if (message.IsMultipart) 
    { 
     foreach (SharpMimeMessage subMessage in message) 
     { 
      parseMessage(subMessage); 
     } 
    } 
    else 
    { 
     System.IO.File.WriteAllText(@"D:\Extracts\" + message.Name, 
      message.BodyDecoded, message.Header.Encoding); 
    } 
} 

你有什麼建議,如何解決這個問題?

+0

FWIW,你應該看看[MimeKit(https://github.com/jstedfast/MimeKit),因爲它是在75X解析的消息比SharpMimeTools更快。它也更加健壯和符合標準。 – jstedfast 2014-02-13 21:58:21

回答

2

您正在使用WriteAllText寫出二進制文件。你不能指望用文本編寫器寫出一個PNG。

WriteAllText應該只用於文本內容類型。對於其他內容類型,您應該使用WriteAllBytes

而且,在你的代碼,你寫的用它與發送的原始文本編碼的文本。不管原來是什麼,你可能都想使用UTF-8。

+0

謝謝! 我現在寫的用文件: 'System.IO.File.WriteAllBytes(@ 「d:\提取物\」 + message.Name,StrToByteArray(message.BodyDecoded));' 和 '公共靜態字節[] StrToByteArray(字符串str) { System.Text.UTF8Encoding編碼=新System.Text.UTF8Encoding(); return encoding.GetBytes(str); }' 但仍然有損壞的文件。我仍然在寫信息錯誤嗎? (希望註釋的格式工程...) – DIF 2012-02-02 08:04:01

+0

@Birgit_B,不,這是完全錯誤的,你不能假設一個PNG是UTF-8字符串,它只是不會是,因爲它不是一個字符串。你想要的東西像'SharpMimeMessage.GetBytes',但沒有一個。嘗試'DumpBody'作爲附件。或者嘗試附件集合。 – Ben 2012-02-02 09:34:56

+0

謝謝! 'SharpMimeMessage.DumpBody()'做到了! – DIF 2012-02-02 12:24:32