2011-08-05 49 views
0

我正在嘗試使用下面的代碼檢索電子郵件附件並將其保存到文件系統中的特定目錄。Openpop.NET將附件重新連接到特定文件夾

Dim objMail As Message = New Message(Encoding.ASCII.GetBytes(strMessage)) 

For Each att In objMail.FindAllAttachments() 
    Dim Stream as FileStream = New FileStream("D:\XX\" & att.FileName.ToString(), 
     FileMode.Create) 
    Dim BinaryStream As New BinaryWriter(Stream) 
    BinaryStream.Write(BitConverter.ToString(att.Body)) 
    BinaryStream.Close() 
Next 

我也曾嘗試att.GetBodyasText()

使用此代碼我能夠保存附件文件所需的文件夾中。但在打開文件時,出現錯誤 - >文件格式不正確或解碼不正確。

我是新來的MIME編碼/解碼。你能幫我解決這個問題嗎?

它真的很緊急。

回答

8

我是OpenPop.NET的開發者。

有與您所使用的實例消息類代碼多個問題:

  1. 哪裏strMessage內容正在添加從?
  2. 你怎麼知道它只用ASCII編碼?

這兩個主要問題可能會造成很大的差異。 您不應該使用字符串來包含消息,而應該使用原始字節!

例如(在C#):

byte[] byteMessage = someFileStream.ReadToEnd(); 
Message message = new Message(byteMessage); 

以這種方式,就不會通過使用關於字節的錯誤的編碼破壞該消息。通常,電子郵件將包含一個標題,告訴如何將字節解碼爲字符串,OpenPop消息類將爲您執行的操作。

現在讓我來解釋一下附件。附件通常是原始字節,例如,PNG圖片是PNG圖片閱讀器將理解的一些字節。爲了讓PNG圖片閱讀器理解圖片,附件原始字節必須保存到文件中。您可以使用att.Body獲取原始字節。

還有一些附件中原始字節沒有意義 - 例如,在BASE64中編碼的文本附件對於文本閱讀器程序來說不是非常有用,並且這樣的附件必須在保存之前轉換爲文本。您可以使用att.GetBodyAsText()獲取文本。

你在做什麼是取附件的原始字節,然後使用BitConverter將它轉換成十六進制數字 - 我不能做任何含義。相反,你應該改變你:

BinaryStream.Write(BitConverter.ToString(att.Body)) 

BinaryStream.Write(att.Body) 

的情況下,您的附件是一個畫面或一些更復雜的文件。

我希望這可以幫助你的問題。

+0

感謝foens的快速響應.. 我想從數據庫和retrive郵件附件獲取郵件。 數據庫郵件內容保存在varbinary數據類型中。我得到這些郵件內容將其轉換爲字符串進行一些處理,並再次轉換爲byte()使用ASCIIEncoding.ASCII.getBytes()爲附件重試。此外,我已經嘗試att.GetBodyAsText(),att.Body作爲參數爲BinaryWriter 。但仍然錯誤是一樣的!沒有解碼正確的時候打開導出pdf文檔..請幫助.. –

+0

還有一件事..我得到PlainText和Html MessagePart在適當的格式..我也試過att.SaveToFile(新的FileInfo(「文件路徑」))保存附件..但沒有改進 –

+1

誰將電子郵件添加到數據庫?電子郵件(原始)_CANNOT_被存儲爲字符串,因爲它沒有任何意義。它們應該存儲爲BLOB(Binary Large OBject),或者用於存儲原始字節的內容。如果使用ASCII.getBytes(),則必須確保整個電子郵件都是ASCII格式的,否則您將生成錯誤的字節 - 以後OpenPop將難以計算出這些字節(因此會產生錯誤的附件)。我認爲這是你的主要問題。簡單地說:您給OpenPop一封電子郵件,其中所有內容可能已被錯誤的編碼摧毀。 – foens

相關問題