检索电子邮件的AlternateView

7
我似乎无法从System.Net.Mail.AlternateView中检索AlternateView。
我有一个通过POP3拉取电子邮件的应用程序。我了解如何创建用于发送的备用视图,但是在查看电子邮件时如何选择备用视图呢?我已经将收到的电子邮件作为System.Net.MailMessage对象,因此可以轻松提取正文、编码、主题等。我可以看到AlternateViews,也就是说,我可以看到计数为2,但想要提取当前请求正文时返回的HTML之外的其他内容。
希望这有一定的意义,并且有人能够阐明一些。最终,我想要提取纯文本,而不是HTML,并且不想自己解析它。
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));

1
view.ContentType 没有 CharSet 属性吗? - scw
1
@scw 这段代码片段直接来自于处理MailMessage的实用方法运行代码。它至少在.NET 4和4.5中有效。希望能有所帮助。 - John Kaster
1
在我的情况下,在调用encoding.GetString()之前,需要将dataStream.Position设置为0。 - jk7

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));
    }

4
有一种更简单的方法:
public string GetPlainTextBodyFromMsg(MailMessage msg)
{
    StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream);
    return(plain_text_body_reader.ReadToEnd());
}

如果第一个备选视图通常是纯文本版本,则此方法适用。


1

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

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

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

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

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接