检索AlternateView的电子邮件

时间:2008-11-14 22:31:59

标签: c# html email pop3 plaintext

我似乎无法从System.Net.Mail.AlternateView中检索AlternateView。

我有一个通过POP3提取电子邮件的应用程序。我了解如何创建备用视图以进行发送,但在查看电子邮件时如何选择备用视图。我收到的电子邮件是一个System.Net.MailMessage对象,所以我可以轻松地拉出正文,编码,主题行等。我可以看到AlternateViews,也就是说,我可以看到计数是2但是想要在我请求正文时,提取当前返回的HTML以外的内容。

希望这有一点意义,有人可以对此有所了解。最后,我希望将明文拉出来,而不是HTML,而不想自己解析它。

4 个答案:

答案 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/

希望这有帮助!