检索 AlternateView 的电子邮件

Posted

技术标签:

【中文标题】检索 AlternateView 的电子邮件【英文标题】:Retrieving AlternateView's of email 【发布时间】:2010-09-22 10:37:59 【问题描述】:

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

我有一个通过 POP3 提取电子邮件的应用程序。我了解如何创建用于发送的备用视图,但是在查看电子邮件时如何选择备用视图。我已将收到的电子邮件作为 System.Net.MailMessage 对象,因此我可以轻松提取正文、编码、主题行等。我可以看到 AlternateViews,也就是说,我可以看到计数为 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/

希望这会有所帮助!

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

view.ContentType 没有字符集? @scw 该代码 sn-p 直接来自用于处理 MailMessage 的实用程序方法中的运行代码。它至少适用于 .NET 4 和 4.5。希望对您有所帮助。 在我的情况下,dataStream.Position 需要在 encoding.GetString() 被调用之前设置为 0。【参考方案4】:

有一个更简单的方法:

public string GetPlainTextBodyFromMsg(MailMessage msg)

    StreamReader plain_text_body_reader = new StreamReader(msg.AlternateViews[0].ContentStream);
    return(plain_text_body_reader.ReadToEnd());

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

【讨论】:

以上是关于检索 AlternateView 的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 .NET 中向电子邮件添加内容描述

TOM随心邮——一款好用的移动办公利器

南邮数据结构考试时间

电子邮箱登陆3大方式普及

android 邮件服务器,全球邮企业邮箱Android(安卓)系统手机 POP3 IMAP协议设置方法

检测过期的电子邮件地址? [复制]