[英]Modifying ActiveInlineResponseWordEditor from a Outlook 2007 add-in
我開發了一個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編輯器的有效引用,因此更改不會持續存在,但其他人是否有任何想法?
請查看此鏈接,這可能對您的問題有所幫助:
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;
嘗試閱讀傳出消息的HTMLBody,將其加載到IHTMLDocument對象中,修改鏈接,然后重置HTMLBody屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.