好吧,這是有點一個棘手的...「讀」事件的MailItem 2007 VSTO VB.NET
我編程的加載項的MS Outlook 2007,使用VS 2010和VSTO和VB.NET。我的目標是提示用戶打印他們從某些電子郵件地址收到的電子郵件。 (這將通過一個簡單的MsgBox完成。)
具體來說,我想提示用戶何時完成閱讀電子郵件。我的觀點是它應該與Outlook中的「讀取收據」功能類似。 (你知道,那些煩人的事... 「發件人請求表明您已經閱讀這封電子郵件等等等等收據」)
因此,用戶讀取電子郵件,然後當他們去關閉督察(或者如果它們處於資源管理器視圖中,則將焦點更改爲不同的項目),彈出MsgBox。我注意到這個時間與電子郵件變成「讀取」時相符。
我一直在整個谷歌和MSDN和教程的網站幾天追這個,這裏就是我發現:
回合1: 的的MailItem對象有未讀的屬性,它也有一個PropertyChange事件。我可以在收件箱中的每個Mailitem上爲PropertyChange使用AddHandler,將它們綁定到一個檢查PropertyChange事件參數的單個子例程中,以確保它是UnRead。似乎相當可行,除了PropertyChange沒有傳遞調用對象的身份,所以我無法知道收件箱中的電子郵件剛剛失去「未讀」狀態。
事實上,沒有一個Mailitem事件似乎通過它們的身份,可能是因爲某人(我猜)我們假設你有一個直接指向Mailitem對象的指針。所以這條路線似乎不起作用。
回合2: 我可以抓住所有的Mailitems的收件箱中到一個集合,然後限制他們只是未讀的。
Dim inbox As Outlook.MAPIFolder = Nothing
Dim WithEvents unreadItems As Outlook.Items
inbox = Me.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
unreadItems = inbox.Items.Restrict("[Unread]=true")
由於unreadItems被變灰WITHEVENTS,我可以寫一個小組以處理unreadItems.ItemRemove,這將很好地工作。但是ItemRemove事件沒有對象參數!衛生署!
回合3: 比方說,我做相反的:我得到的收件箱內容,並限制[未讀] = FALSE,然後使用.ItemAdd事件。這在一定程度上會起作用,不同之處在於理論上只要用戶從任何文件夾將「[Unread] = false」項目轉儲到收件箱中,而不是從收件箱中的Unread到Read組中進行更改。所以,除非我在這裏誤解了一些東西,也不是一種選擇。
回合4: 現在,這是我又想到了被簡單地調暗收件箱中的物品收集WITHEVENTS並打算關閉.ItemChange事件,但這一事件並沒有真正說明什麼改變了一下對象,所以沒有骰子。
最後,我很困惑這一點。我非常接近從我的目標中退縮。蹩腳的選擇是在用戶收到來自指定地址之一的電子郵件時提醒用戶(因爲我相信Application.NewMail事件不會給我帶來任何麻煩)。但是,我將不得不提醒用戶 - 我不會提示他們打印他們還沒有閱讀過的電子郵件。
這種替代方法是不可取的,我想我會提出我的問題進行檢查和建議。
-Matt
P.S.我來自使用Objective-C製作iPad應用程序,在那裏我自己構建大部分對象層次結構......要處理具有此類限制的COM對象是很奇怪的。
非常好。實際上,我想我應該想到這一點。一個問題:如果有人關閉該選項,甚至有可能達到相同的效果(因此,即使他們看到它們,所有電子郵件仍然保持閱讀狀態)。我想知道如何配置Outlook時讀取回執功能的行爲。我必須檢查一下。無論哪種方式,你基本上解決了我的問題! –