【问题标题】:Content of HTMLBody property differs between SafeMailItem and MailItemSafeMailItem 和 MailItem 的 HTMLBody 属性内容不同
【发布时间】:2020-06-22 08:42:52
【问题描述】:

撰写新邮件(使用 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) 向用户显示电子邮件?

【问题讨论】:

    标签: c# outlook office-interop outlook-redemption


    【解决方案1】:

    我终于找到了solution

    调用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;
    

    【讨论】:

    • 是的,否则 MAPI 和 Redemption 无法看到最新的更改。
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 2016-03-22
    • 2023-03-18
    • 2017-07-27
    • 2018-07-13
    • 2012-09-06
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多