【问题标题】:C# Outlook mailItem.HTMLBody is EmptyC# Outlook mailItem.HTMLBody 为空
【发布时间】:2016-06-30 00:49:49
【问题描述】:

我正在处理 Outlook 插件,我想在用户正在阅读的邮件的 html 中查找一些特定标签。就此而言,我正在使用 ActiveExplorer 的选择更改事件。

currentExplorer.SelectionChange += new Outlook
                .ExplorerEvents_10_SelectionChangeEventHandler
                (CurrentExplorer_Event);


 private void CurrentExplorer_Event()
        {
                if (this.Application.ActiveExplorer().Selection.Count == 1)
                {
                    Object selObject = this.Application.ActiveExplorer().Selection[1];
                    if (selObject is Outlook.MailItem)
                    {

                        Outlook.MailItem mailItem = (selObject as Outlook.MailItem);
                        lookForTags(mailItem.HTMLBody);
                     }
                 } 
         }

问题在于,要使其正常工作,用户必须点击邮件两次,因为第一次邮件仍在加载中,mailItem.HTMLBody 返回:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META NAME="Generator" CONTENT="MS Exchange Server version 08.01.0240.003">
<TITLE></TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

</BODY>
</HTML>

然后第二次,邮件完成加载,所以 mailItem.HTMLBody 返回真实正文,一切正常。邮件加载完成后是否会触发任何其他事件,以便我可以开始执行我的代码?或者有没有更好的解决方案来避免 HTMLBody 为空?

【问题讨论】:

  • 这是什么消息存储?

标签: c# html outlook add-in


【解决方案1】:

您是否使用缓存的 Exchange 模式?

通常,该项目已在 SelectionChange 事件处理程序中可用。无需等待。您在 PC 上安装了哪个 Outlook 版本?

我还建议立即释放底层 COM 对象。使用 System.Runtime.InteropServices.Marshal.ReleaseComObject 在您使用完 Outlook 对象后释放它。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null)以释放对对象的引用。您可以在 MSDN 的 Systematically Releasing Objects 文章中阅读更多相关信息。

【讨论】:

  • 我使用的是 Outlook 2010。
  • 您是否尝试过查看代码并添加发布声明?
【解决方案2】:

你可以使用 Open 事件

Inspectors allInspectors;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {

            allInspectors = Globals.ThisAddIn.Application.Inspectors;
            allInspectors.NewInspector += new Microsoft.Office.Interop.Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

        }


        void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
        {
            if (Inspector.CurrentItem is Outlook.MailItem)
            {
                mailItem.Open += new ItemEvents_10_OpenEventHandler(MailItemOpen);

            }
        }

        public void MailItemOpen(ref bool Cancel)
        {
            var mailItem = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem as Outlook.MailItem;
            string text = mailItem.HTMLBody;
        }

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2015-06-19
    • 1970-01-01
    • 2019-04-17
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    相关资源
    最近更新 更多