2008-11-14 51 views
4

我似乎無法從System.Net.Mail.AlternateView中檢索AlternateView。檢索郵件的AlternateView's

我有一個應用程序正在通過POP3拉電子郵件。我瞭解如何爲發送創建備用視圖,但在查看電子郵件時如何選擇備用視圖。我已經將收到的電子郵件作爲System.Net.MailMessage對象,因此我可以輕鬆地提取正文,編碼,主題行等。我可以看到AlternateViews,也就是說,我可以看到count是2,但是想要提取除當前請求正文時返回的HTML以外的其他內容。

希望這樣做有一定的意義,並且有人可以對此有所瞭解。最後,我希望將明文拉出來,而不是HTML,而不是自己解析它。

回答

1

它不能立即解析一個電子郵件與System.Net.Mail命名空間中可用的類;您需要創建自己的MIME解析器,或者使用第三方庫。

Peter Huber SG編寫的這篇偉大的Codeproject文章,標題爲'POP3 Email Client with full MIME Support (.NET 2.0)'將讓您瞭解如何實現MIME處理以及相關的RFC規範文章。

您可以使用Codeproject文章作爲編寫您自己的解析器的開始,或者評估一個庫,如SharpMimeTools,這是一個用於解析和解碼MIME電子郵件的開源庫。

http://anmar.eu.org/projects/sharpmimetools/

希望這有助於!

6

我有同樣的問題,但你只需要從流中讀取它。這裏有一個例子:

public string ExtractAlternateView() 
    { 
     var message = new System.Net.Mail.MailMessage(); 
     message.Body = "This is the TEXT version"; 

     //Add textBody as an AlternateView 
     message.AlternateViews.Add(
      System.Net.Mail.AlternateView.CreateAlternateViewFromString(
       "This is the HTML version", 
       new System.Net.Mime.ContentType("text/html") 
      ) 
     ); 

     var dataStream = message.AlternateViews[0].ContentStream; 
     byte[] byteBuffer = new byte[dataStream.Length]; 
     return System.Text.Encoding.ASCII.GetString(byteBuffer, 0, dataStream.Read(byteBuffer, 0, byteBuffer.Length)); 
    } 
9

Mightytighty正在引導你走向正確的道路,但你不應該認爲編碼的類型。這應該做的伎倆:

var dataStream = view.ContentStream; 
dataStream.Position = 0; 
byte[] byteBuffer = new byte[dataStream.Length]; 
var encoding = Encoding.GetEncoding(view.ContentType.CharSet); 
string body = encoding.GetString(byteBuffer, 0, 
    dataStream.Read(byteBuffer, 0, byteBuffer.Length)); 
+1

`view.ContentType`沒有CharSet? – scw 2013-05-23 16:23:15

1

有一個簡單的方法:

public string GetPlainTextBodyFromMsg(MailMessage msg) 
{ 
    StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream); 
    return(plain_text_body_reader.ReadToEnd()); 
} 

這工作,如果第一另一種觀點是純文本版本,因爲它通常發生。