【发布时间】: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