2008-11-14 48 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()); 
} 

这工作,如果第一另一种观点是纯文本版本,因为它通常发生。