2016-09-28 62 views
0

我有一個Outlook COM加載項(C#,Visual Studio 2012),它擴展了帶有附加消息屬性的標準表單。該加載項可與Outlook 2010,2013和2016一起使用。將屬性從命名空間PS_INTERNET_HEADERS映射到PS_PUBLIC_STRINGS

加載項的要求決定了它支持在名稱空間PS_INTERNET_HEADERS中讀寫一組屬性。我遵循http://blogs.technet.com/b/exchange/archive/2009/04/06/3407221.aspx中的指導原則,在傳入消息升級到MAPI屬性時具有此類標頭。

但據我所知,所有這些標題將成爲MAPI字符串屬性,對吧?!但是其中幾個頭實際上有更多的自然類型。其中一個標題是一個RFC5322日期時間標題,並具有類似'Wed,28 Sep 2016 06:27:00 GMT'的值。有這樣一個標頭映射到PT_UNICODE類型的MAPI屬性是不是最佳的,因爲您不能根據它進行排序的消息,你不能真正使用它在搜索等。

有沒有很好的解決這個問題?

我唯一的想法是做一些從命名空間PS_INTERNET_HEADERS中的屬性到名稱空間PS_PUBLIC_STRINGS中的屬性的映射。這將會在打印消息時包含屬性的好的副作用。但是如果我必須走這條路,我需要一些鉤子來做映射。我當然可以循環訪問消息存儲中的所有消息,收聽新消息,偵聽已更改的消息等 - 但這不是一個好的解決方案。我想我也可以編寫一個Exchange傳輸代理,但我真的想保留在客戶端的邏輯。

有什麼建議嗎?梅德的評論後

編輯:

對於傳出消息,我必須使用命名空間PS_INTERNET_HEADERS性能,因爲這樣的消息最終被運SMTP(交易所之外的)其他系統。詳細地說,我必須遵守https://tools.ietf.org/html/rfc6477。作爲副作用,Exchange將傳入消息將這些頭文件提升爲名稱空間PS_INTERNET_HEADERS中的屬性。這一切都工作正常。

但即使在這種情況下,我想按照您的建議在我的代碼中顯式提取屬性,並在命名空間PS_PUBLIC_STRINGS中寫入一些新屬性。我看到的挑戰是使用哪個鉤子來運行該代碼。用戶應該能夠使用映射的屬性作爲視圖中的列,排序,過濾,搜索,收件箱規則等。我可以掃描整個消息存儲庫來執行映射,我可以偵聽各種Outlook對象模型事件,但最後,我很難看到如何避免用戶暫時看到我的代碼尚未處理的消息。

我有一個用C++編寫的使用擴展MAPI進行類似挑戰的舊外接程序。在啓動時,對於每個IMsgStore中的每個收件箱,它會掃描整個收件箱(可能是一個相當昂貴的操作),然後使用IMAPIFolder :: GetContentsTable和IMAPITable :: Advise訂閱更改。但我的經驗是,我現在會得到表格通知TABLE_ERROR或TABLE_RELOAD,並且將不得不做另一次掃描。對於IMsgStore ::建議我猜想類似的挑戰存在?!在C#上下文中,我可以使用Redemption類RDOStore(例如OnMessageModified)中的事件,但我認爲該類使用IMsgStore :: Advise ?!

+0

是的,你的假設是正確的。但是您應該能夠修改視圖以顯示PS_INTERNET_HEADERS命名空間中的屬性。它們不需要成爲PS_PUBLIC_STRINGS - 視圖XML使用DASL屬性名稱。 –

+0

我有意見,沒問題。還安裝了帶有屬性定義的普通舊.cfg文件。但我的問題仍然存在:包含日期時間值的字符串屬性可以是_shown_,但不能將它們用於排序,過濾和類似的事情 - 這是我真正的問題。 –

+0

然後你真的要做出選擇,只能在你的代碼中明確地設置PT_SYSTIME屬性... –

回答

0

不,該屬性類型永遠不會轉換。它始終保持爲一個字符串。爲什麼不從PR_TRANSPORT_MESSAGE_HEADERS屬性(DASL名稱http://schemas.microsoft.com/mapi/proptag/0x007D001F)中讀取Internet標題並在代碼中明確提取屬性?您將完全控制哪些屬性被提取以及如何轉換。

+0

請查看我的問題所做的更改。 –

相關問題