从Outlook 2007插件修改ActiveInlineResponseWordEditor

3

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

不幸的是,自从Office 2013推出以来,这种方法无法与内联响应功能一起使用,这意味着快速回复会被忽略。

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

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

当我将此解决方案打包并安装到测试机器上时,代码仍按预期执行(我可以从我正在做的某些日志中看到这一点),我所做的更改实际上没有在发送的电子邮件中持久保存 - 只有对于内联响应,所有其他功能都正常工作。

我使用以下代码段访问文档:

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.");
}

我使用这个文档来修改所有使用以下代码片段创建的链接:

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编辑器的有效引用,因此更改不会持久化,但其他人有什么想法吗?


那段代码什么时候运行?你确定它会运行吗? - Dmitry Streblechenko
嗨@DmitryStreblechenko,代码确实执行了,记录器正在记录到文件中,所以我可以监视输出。所有的代码都在Application.Item_Send事件中运行。 - Ant Swift
尝试读取发送消息的HTMLBody,将其加载到IHTMLDocument对象中,修改链接,然后重置HTMLBody属性。 - Dmitry Streblechenko
@DmitryStreblechenko,我使用了HtmlAgilityPack而不是IHTMLDocument来完成这个。虽然是一种解决方法,但问题已经解决了。请添加答案,我会接受它。 - Ant Swift
2个回答

3
请查看此链接,这可能对您的问题有所帮助: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。请尝试进行修改,看看是否能够获得一个文档对象,该对象与Outlook早期版本类似。

您应该尝试以下代码:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接