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