【问题标题】:Modifying ActiveInlineResponseWordEditor from a Outlook 2007 add-in从 Outlook 2007 加载项修改 ActiveInlineResponseWordEditor
【发布时间】:2023-04-08 23:07:01
【问题描述】:

我开发了一个 Outlook 2007 插件,它在 Application.ItemSend 事件上对电子邮件中的每个超链接进行了小幅更改。这是通过获取活动检查器的 Inspector.WordEditor 属性并查看 Hyperlinks 属性来完成的。

很遗憾,自从 Office 2013 推出以来,此方法不适用于内联响应功能,这意味着快速回复将被忽略。

我正在修改此插件以尝试使其正常工作,但我遇到了一些奇怪的行为。

在本地运行时,无论有没有调试器,我都可以使用反射来获取 Application.ActiveExplorer() 的 ActiveInlineResponseWordEditor 属性并进行相同的更改,一切看起来都很好。

当我打包此解决方案并将其安装在测试机器上时,代码仍会执行(我可以从我正在做的一些日志记录中看到这一点),我所做的更改实际上并未保留在发送的电子邮件中 ​​- 仅用于内联响应,所有其他功能都可以正常工作。

我可以使用以下 sn-p 访问文档:

Word.Document doc = null;

var explorer = Application.ActiveExplorer();
var wrapper = InspectorWrapper.GetWrapperFor(mailItem.GetInspector, logger);

try
{
    doc = (Word.Document)explorer.GetType().GetProperty("ActiveInlineResponseWordEditor").GetValue(explorer, null);
}
catch (TargetInvocationException) { /*Silently fail */ }

if (doc == null)
{
    if (wrapper is MailItemWrapper)
    {
        doc = wrapper.Inspector.WordEditor as Word.Document;
        logger.Log("Have inspector document.");
    }
}
else
{
    logger.Log("Have in-line document.");
}

我使用这个文档来修改使用这个 sn-p 完成的所有链接:

foreach (Word.Hyperlink link in doc.Hyperlinks)
{
    var uriBuilder = new UriBuilder(link.Address);

    var query = HttpUtility.ParseQueryString(uriBuilder.Query);
    query.Set("id", 1);

    uriBuilder.Query = query.ToString();

    var newLink = uriBuilder.ToString();

    logger.Log(string.Format("{0} to {1}", link.Address, newLink));

    link.Address = newLink;
}

我尝试只访问 MailItem.GetInspector 属性,但同样的症状退出。我也尝试在完成更改后调用 mailItem.Save(),再次出现症状。

我的预感是我没有得到对 Word 编辑器的有效引用,因此更改不会保留,但其他人有什么想法吗?

【问题讨论】:

  • 该代码究竟何时运行?你确定它可以运行吗?
  • 嗨@DmitryStreblechenko,代码确实执行了,记录器正在记录到一个文件中,所以我可以监控输出。所有代码都在 Application.Item_Send 事件中运行。
  • 尝试读取外发邮件的 HTMLBody,将其加载到 IHTMLDocument 对象中,修改链接,然后重置 HTMLBody 属性。
  • @DmitryStreblechenko,我用 HtmlAgilityPack 而不是 IHTMLDocument 做到了这一点。解决方法,当然,但问题已解决。添加答案,我会接受。

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


【解决方案1】:

请查看此链接,这可能对您的问题有所帮助:

http://www.add-in-express.com/creating-addins-blog/2012/10/19/customize-outlook2013-inline-response/

重要的部分是:

如何在 Outlook 2013 中获取内联响应项

这里他们提到从链接粘贴:

“请记住,如果您开发的加载项支持早期 Outlook 版本以及使用版本中性互操作,则需要使用后期绑定技术来访问 ActiveInlineResponse 属性。”

代码如下:

explorer = OutlookApp.ActiveExplorer();
        // response = explorer.ActiveInlineResponse;
        response = explorer.GetType().InvokeMember("ActiveInlineResponse",
                             System.Reflection.BindingFlags.GetProperty | 
                             System.Reflection.BindingFlags.Instance |
                             System.Reflection.BindingFlags.Public, 
                             null, explorer, null) as Outlook.MailItem;

我的理解是使用属性“ActiveInlineResponseWordEditor”是您需要使用后期绑定,因为您的插件与早期版本兼容 - 2007、2010。请尝试此修改是否适合您并且您能够获取一个 doc 对象,其工作方式类似于早期版本的 Outlook。

你应该试试下面的代码:

doc = explorer.GetType().InvokeMember("ActiveInlineResponseWordEditor",
                                 System.Reflection.BindingFlags.GetProperty | 
                                 System.Reflection.BindingFlags.Instance |
                                 System.Reflection.BindingFlags.Public, 
                                 null, explorer, null) as Word.Document;

【讨论】:

    【解决方案2】:

    尝试读取传出消息的 HTMLBody,将其加载到 IHTMLDocument 对象中,修改链接,然后重置 HTMLBody 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多