c# - SafeMailItem 和 MailItem 的 HTMLBody 属性内容不同
问题描述
撰写新邮件(使用 Outlook 365)时,应在 MailItem 向用户打开之前处理 HTML 正文。为了避免安全警告,我SafeMailItem
用来读取HTMLBody
属性:
Application outlook = new Application();
MailItem mailItem = outlook.CreateItem(OlItemType.olMailItem);
inspector = mailItem.GetInspector;
SafeMailItem safeMailItem = new SafeMailItem();
safeMailItem.Item = mailItem;
Console.WriteLine("HTMLBody (SafeMailItem): " + Environment.NewLine + safeMailItem.HTMLBody);
Console.WriteLine("HTMLBody (MailItem): " + Environment.NewLine + mailItem.HTMLBody);
// Manipulate HTML body
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(safeMailItem.HTMLBody); // Avoid security warning
HtmlNode firstParagraph = doc.DocumentNode.SelectSingleNode("/html/body//p");
firstParagraph.FirstChild.InnerHtml = "My custom text";
mailItem.HTMLBody = doc.DocumentNode.WriteContentTo(); // Change HTML body of email
mailItem.Display(false);
// Listen to close/send
((InspectorEvents_10_Event)mailItem.GetInspector).Close += MailItem_Close;
outlook.ItemSend += Outlook_ItemSend;
输出是:
HTMLBody (SaveMailItem):
<HTML>
<HEAD><META http-equiv=Content-Type content="text/html; charset=UTF-8"></HEAD>
<BODY>
<!-- Converted from text/plain format -->
</BODY></HTML>
HTMLBody (MailItem):
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=ProgId content=Word.Document><meta name=Generator content="Microsoft Word 15"><meta name=Originator content="Microsoft Word 15"><link rel=File-List href="cid:filelist.xml@01D64880.436A9300"><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><link rel=themeData href="~~themedata~~"><link rel=colorSchemeMapping href="~~colorschememapping~~"><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:TrackMoves/>
<w:TrackFormatting/>
<!-- ... -->
为什么有区别?有没有更好的方法来 1) 创建电子邮件 2) 操作 HTML 正文和 3) 向用户显示电子邮件?
解决方案
我终于找到了解决方案。
调用后mailItem.GetInspector
必须MailItem
保存 ( MailItem.Save()
)。所以完整的工作代码是:
Application outlook = new Application();
MailItem mailItem = outlook.CreateItem(OlItemType.olMailItem);
inspector = mailItem.GetInspector;
mailItem.Save(); // Save mailItem to ensure that HTMLBody can be access from SafeMailItem
SafeMailItem safeMailItem = new SafeMailItem();
safeMailItem.Item = mailItem;
Console.WriteLine("HTMLBody (SafeMailItem): " + Environment.NewLine + safeMailItem.HTMLBody);
Console.WriteLine("HTMLBody (MailItem): " + Environment.NewLine + mailItem.HTMLBody);
// Manipulate HTML body
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(safeMailItem.HTMLBody); // Avoid security warning
HtmlNode firstParagraph = doc.DocumentNode.SelectSingleNode("/html/body//p");
firstParagraph.FirstChild.InnerHtml = "My custom text";
mailItem.HTMLBody = doc.DocumentNode.WriteContentTo(); // Change HTML body of email
mailItem.Display(false);
// Listen to close/send
((InspectorEvents_10_Event)mailItem.GetInspector).Close += MailItem_Close;
outlook.ItemSend += Outlook_ItemSend;
推荐阅读
- typescript - 打字稿:箭头功能的通用功能类型/接口
- rest - 什么是 API“突发”请求以及如何在 python 中创建它们?
- javascript - 如何使材料 UI 选项卡标签离开?默认情况下它的中心对齐
- elasticsearch - 密集向量数组和余弦相似度
- php - 通过不相等的值过滤多维数组以排除重复的记录
- java - 如何对具有不同整数值的数组进行排序
- hive - 如何使用查询表分区列表
- azure-devops - Azure 代理配置设置错误 WinHttp 错误:ERROR_WINHTTP_TIMEOUT
- shell - 如何从管道访问环境变量并将其传递给发布管道
- python - 未找到 Pyscopg2 模块