MimeKit.MimeMessage到浏览器可渲染的HTML

时间:2015-07-14 21:42:43

标签: c# mimekit

有没有办法将MimeKit.MimeMessage转换为可以在Web浏览器中呈现的HTML?我不关心邮件附件,但希望能够在浏览器中显示带有嵌入图像的邮件正文。我是MimeKit的新手,无法在API文档中找到任何内容。任何信息都表示赞赏。

编辑:我没有找到一种方法与MimeKit本地完成这项工作,但我将它与HtmlAgilityPack结合起来解析MimeMessage.HtmBody并修复内嵌图像。这似乎有效,除非有人有更好的主意,否则我会继续使用它。作为参考,这里是代码:

//////////////////////////////////////////////////////////////////////////////////////////
// use MimeKit to parse the message
//////////////////////////////////////////////////////////////////////////////////////////
MimeKit.MimeMessage msg = MimeKit.MimeMessage.Load(stream);

//////////////////////////////////////////////////////////////////////////////////////////
// use HtmlAgilityPack to parse the resulting html in order to fix inline images
//////////////////////////////////////////////////////////////////////////////////////////
HtmlAgilityPack.HtmlDocument hdoc = new HtmlAgilityPack.HtmlDocument();
hdoc.LoadHtml(msg.HtmlBody);
// find all image nodes
var images = hdoc.DocumentNode.Descendants("img");
foreach (var img in images)
{                        
    // check that this is an inline image
    string cid = img.Attributes["src"].Value;
    if (cid.StartsWith("cid:"))
    {
        // remove the cid part of the attribute
        cid = cid.Remove(0, 4);
        // find image object in MimeMessage
        MimeKit.MimePart part = msg.BodyParts.First(x => x.ContentId == cid) as MimeKit.MimePart;
        if (part != null)
        {
            using (MemoryStream mstream = new MemoryStream())
            {
                // get the raw image content
                part.ContentObject.WriteTo(mstream);
                mstream.Flush();
                byte[] imgbytes = mstream.ToArray();
                // fix the image source by making it an embedded image
                img.Attributes["src"].Value = "data:" + part.ContentType.MimeType + ";" + part.ContentTransferEncoding.ToString().ToLower() + "," +
                    System.Text.ASCIIEncoding.ASCII.GetString(imgbytes);
            }
        }
    }
}

// write the resulting html to the output stream
hdoc.Save(outputStream);

0 个答案:

没有答案