7

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

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

希望这有一定的意义,并且有人可以对此有所了解。最后,我希望提取纯文本,而不是 HTML,并且不想自己解析它。

4

4 回答 4

12

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));
于 2011-07-18T17:41:22.967 回答
9

我遇到了同样的问题,但你只需要从流中读取它。这是一个例子:

    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));
    }
于 2009-09-25T17:13:56.113 回答
4

有一个更简单的方法:

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

如果第一个替代视图是纯文本版本,这很有效,因为它通常发生。

于 2013-11-16T21:57:07.083 回答
1

使用 System.Net.Mail 命名空间中可用的类无法立即解析电子邮件;您要么需要创建自己的 MIME 解析器,要么改用第三方库。

Peter Huber SG 撰写的这篇很棒的 Codeproject 文章,题为“具有完整 MIME 支持 (.NET 2.0) 的 POP3 电子邮件客户端”,将让您了解如何实现 MIME 处理以及相关的 RFC 规范文章。

您可以使用 Codeproject 文章作为开始编写自己的解析器,或者评估像SharpMimeTools这样的库,这是一个用于解析和解码 MIME 电子邮件的开源库。

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

希望这可以帮助!

于 2008-11-17T19:09:42.840 回答