簡體   English   中英

從Outlook 2007加載項修改ActiveInlineResponseWordEditor

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM