其他分享
首页 > 其他分享> > 从Outlook 2007加载项修改ActiveInlineResponseWordEditor

从Outlook 2007加载项修改ActiveInlineResponseWordEditor

作者:互联网

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

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

解决方法:

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

标签:outlook,outlook-addin,c,office-interop
来源: https://codeday.me/bug/20191029/1957497.html