我似乎无法从System.Net.Mail.AlternateView中检索AlternateView。
我有一个通过POP3提取电子邮件的应用程序。我了解如何创建备用视图以进行发送,但在查看电子邮件时如何选择备用视图。我收到的电子邮件是一个System.Net.MailMessage对象,所以我可以轻松地拉出正文,编码,主题行等。我可以看到AlternateViews,也就是说,我可以看到计数是2但是想要在我请求正文时,提取当前返回的HTML以外的内容。
希望这有一点意义,有人可以对此有所了解。最后,我希望将明文拉出来,而不是HTML,而不想自己解析它。
答案 0 :(得分:11)
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 :(得分: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));
}
答案 2 :(得分:3)
有一种更简单的方法:
public string GetPlainTextBodyFromMsg(MailMessage msg)
{
StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream);
return(plain_text_body_reader.ReadToEnd());
}
如果第一个替代视图是纯文本版本,则通常会发生这种情况。
答案 3 :(得分:1)
无法立即解析包含System.Net.Mail命名空间中可用类的电子邮件;您需要创建自己的MIME解析器,或者使用第三方库。
Peter Huber SG撰写的题为'POP3 Email Client with full MIME Support (.NET 2.0)'的伟大Codeproject文章将让您了解如何实现MIME处理,以及相关的RFC规范文章。
您可以使用Codeproject文章作为编写自己的解析器的开始,或者评估像SharpMimeTools这样的库,这是一个用于解析和解码MIME电子邮件的开源库。
http://anmar.eu.org/projects/sharpmimetools/
希望这有帮助!