【问题标题】:How can i parse html message body using MailKit?如何使用 MailKit 解析 html 邮件正文?
【发布时间】:2016-09-15 03:47:08
【问题描述】:

到目前为止,我一直使用 OpenPop,但现在更改为 MailKit,这两个属性:FindFirstPlainTextVersion()FindFirstHtmlVersion() 在 MailKit 中不存在。

变量 allMessages 不是 OpenPop,但现在是 List<MimeKit.MimeMessage> 类型。

lvnf 是一个 ListView 控件,当我单击一个项目时,它应该显示在 RichTextBox 中,我有我单击的消息的内容。但这两个属性在MailKit(MimeKit.MimeMessage) 中不存在。

void lvnf_Click(object sender, EventArgs e)
{
    OpenPop.Mime.MessagePart plainText = null;
    OpenPop.Mime.MessagePart html = null;
    var firstSelectedItem = ListViewCostumControl.lvnf.SelectedItems[0];
    try
    {
        StringBuilder builder = new StringBuilder();
        if (allLoadedMessages != null)
        {
           plainText  = allLoadedMessages[firstSelectedItem.Index].FindFirstPlainTextVersion();
        }
        if (allMessages != null)
        {
            plainText = allMessages[firstSelectedItem.Index].FindFirstPlainTextVersion();
        }
        if (plainText != null)
        {
            // We found some plaintext!
            builder.Append(plainText.GetBodyAsText());
        }
        else
        {
            // Might include a part holding html instead
            if (allLoadedMessages != null)
            {
                html = allLoadedMessages[firstSelectedItem.Index].FindFirstHtmlVersion();
            }
            if (allMessages != null)
            {
                html = allMessages[firstSelectedItem.Index].FindFirstHtmlVersion();
            }
            if (html != null)
            {
                // We found some html!
                builder.Append(html.GetBodyAsText());
            }
        }
        richTextBox1.Text = builder.ToString();
    }
    catch(Exception err)
    {
        string myer = err.ToString();
    }
}

到目前为止,我尝试的是创建一个新类 HtmlPreviewVisitor 并添加了来自 mailkit 站点的类示例:

mailkit

然后在form1中使用它:

void Render(MimeKit.MimeMessage message)
{
    HtmlPreviewVisitor pv = new HtmlPreviewVisitor(tempDirectory);
    pv.Visit(message);
    var tmpDir = Path.Combine(Path.GetTempPath(), message.MessageId);
    var visitor = new HtmlPreviewVisitor(tmpDir);

    Directory.CreateDirectory(tmpDir);

    message.Accept(visitor);
    richTextBox1.Text = visitor.HtmlBody;
}

并像这样使用渲染:

void lvnf_Click(object sender, EventArgs e)
{
    MimeKit.MimeMessage message = null;
    var firstSelectedItem = ListViewCostumControl.lvnf.SelectedItems[0];
    try
    {
        message = allMessages[firstSelectedItem.Index];
        Render(message);
    }
}

richTextBox1 中的结果是我看到了 html 内容而不是正文的文本。

例如:

<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
        <title>Magic Quadrant for aPaaS</title>
    </head>
    <body oncontextmenu="return false;">
        <center>
            <!-- Header Table For Web Version -->
            <table align="center" border="0" cellpadding="10" cellspacing="0" width="660">
                <tbody>
                    <tr>
                        <td align="center" style="font-family:Helvetica, Arial, sans-serif; font-size:12px; color:#333;">
                            To view a web version of this message, <A TARGET="_blank" HREF="http://clicks.slashdot.org/c.html?ufl=4&amp;rtr=on&amp;s=x8pb08,2jot2,54g,7zdr,51ie,5vra,3kxd&amp;MLM_MID=4277846&amp;MLM_MLID=6640&amp;MLM_SITEID=2010001400&amp;MLM_UNIQUEID=4300628cb1">click here</A></td>
                    </tr>
                </tbody>

...

【问题讨论】:

  • 我还没用过MailKit,但是我做了一个windows服务,使用ActiveUp从电子邮件中读取html,你有兴趣吗?
  • 洛伦佐是的。我想尝试在我的代码中使用它。

标签: c# .net winforms email mailkit


【解决方案1】:

您可以使用TextBody 和/或HtmlBody 属性来获得与您在OpenPop 中提到的方法相同的结果。

像这样:

void Render (MimeKit.MimeMessage message)
{
    var tmpDir = Path.Combine(Path.GetTempPath(), message.MessageId);
    var visitor = new HtmlPreviewVisitor(tmpDir);

    Directory.CreateDirectory(tmpDir);

    message.Accept(visitor);

    // Note: You will need to convert HTML into RTF
    var rtf = ConvertHtmlToRtf (visitor.HtmlBody);

    // Use the Rtf property instead of the Text property because
    // the Text property does not support RTF formatting commands.
    richTextBox1.Rtf = rtf;
}

【讨论】:

  • 我尝试使用 MailKit 站点中的示例 HtmlPreviewVisitor 类。我在我的项目中创建了新类并添加了 HtmlPreviewVisitor,然后像他们展示的那样在 form1 中使用它。
  • jstedfast 我现在也更新了我的问题,包括我尝试了什么以及我得到了什么。我错过了什么?
  • 你不应该使用HtmlBody HtmlPreviewVisitor,你需要选择使用其中一个。此外,您的代码甚至根本没有使用来自HtmlPreviewVisitor 的结果。其次,RichTextBox 旨在显示 RichText 格式的文本,而不是 HTML 格式的文本,这就是它看起来像原始 HTML 的原因。
  • 忽略我最后的评论,除了 RichTextBox 不知道如何呈现 HTML,因此您使用了错误的控件。如果您想要一个呈现 HTML 的实际代码示例,请查看 MimeKit 中包含的示例程序:github.com/jstedfast/MimeKit/blob/master/samples/MessageReader/…
  • @jstedfast 我无法获得具有 src url 而不是 base 64 或内容类型图像的内联图像。你能指出我如何做到这一点的任何例子吗?
【解决方案2】:

使用 ActiveUp,这是实例化连接并具有读取方法的类

 using System.Collections.Generic;
    using System.Linq;
    using ActiveUp.Net.Mail;
    using ActiveUp.Net.Security;
    using System.Diagnostics;
    using System;

namespace servizioWiki
{
    class readMail
    {
        public Imap4Client client = new Imap4Client();
        public readMail(string mailServer, int port, bool ssl, string login, string password)
        {

            if (ssl)
            {
                client.ConnectSsl(mailServer, port);
            }
            else
            client.Connect(mailServer, port);
            client.Login(login, password);
        }
        public IEnumerable<Message> GetAllMails(string mailBox)
        {
            return GetMails(mailBox, "ALL").Cast<Message>();
        }
        public IEnumerable<Message> GetUnreadMails(string mailBox)
        {
            return GetMails(mailBox, "UNSEEN").Cast<Message>();
        }
        protected Imap4Client Client
        {
            get { return client ?? (client = new Imap4Client()); }
        }
        private MessageCollection GetMails(string mailBox, string searchPhrase)
        {
            try
            {
                Mailbox mails = Client.SelectMailbox(mailBox);
                MessageCollection messages = mails.SearchParse(searchPhrase);
                return messages;
            }
            catch(Exception ecc)
            {
                EventLog Log = new EventLog("Application");
                Log.Source = "ServizioWiki";
                Log.WriteEntry("Errore durante la lettura delle mail, dettagli: " + ecc.Message, EventLogEntryType.Warning);
                return null;
            }

        }

    }

为我服务:

read = new readMail(
                            "some.mail.server",
                            port,
                            true,
                            this.username,
                            this.password
                        );
                ...

                var emailList = read.GetAllMails(this.folderEmail);
                Mailbox bbb = read.client.SelectMailbox(this.folderEmail);
                int[] unseen = bbb.Search("UNSEEN");
                foreach (Message email in emailList)
                {
                    byte[] array0 = Encoding.ASCII.GetBytes(email.BodyText.Text);
                    EmbeddedObjectCollection immagini_mail = email.EmbeddedObjects;
                    MimePartCollection immagini_mail2 = email.UnknownDispositionMimeParts;
                    string HtmlEmail+= email.BodyHtml.Text.ToString();
                    string TextEmail= email.BodyText.Text.ToString();
                    if (immagini_mail.Count > 0)
                    {
                      //do something with images

                    }
                }

基本上你可以得到邮件和附件的纯文本或者html 希望这有帮助,让我知道

【讨论】:

  • contento 变量是什么? contenuto += email.BodyHtml.Text.ToString();我不知道如何声明它是什么命名空间。
  • 查看我的编辑,它是一个字符串,基本上是 email.BodyHtml.Text 为您提供电子邮件的 html,而 ToString() 将其作为字符串返回
猜你喜欢
  • 2013-07-12
  • 2015-06-29
  • 2021-06-14
  • 2013-09-22
  • 1970-01-01
  • 2013-11-03
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多