在Outlook 2007 VSTO VB.NET中为Mailitem“读取”事件

时间:2011-11-16 01:23:32

标签: events outlook vsto mailitem

好的,这有点棘手......

我使用VS 2010和VSTO以及VB.NET为MS Outlook 2007编写了一个加载项。我的目标是提示用户打印他们从某些电子邮件地址收到的电子邮件。 (这将通过简单的MsgBox完成。)

具体来说,我希望用户在完成阅读电子邮件时提示。我的概念是它应该与Outlook中的“Read Receipt”功能类似。 (你知道,那些讨厌的东西...... “发件人已经要求收到你已经读过这封电子邮件的收据”等等“

因此,用户阅读电子邮件,然后当他们关闭Inspector时(或者如果他们在资源管理器视图中将焦点更改为其他项目),则会弹出MsgBox。我注意到,当电子邮件变为“已读”时,此时间与此匹配。

我已经在谷歌,MSDN和教程网站上追了几天,这是我发现的:

第1轮: Mailitem对象具有UnRead属性,并且还具有PropertyChange事件。我可以在收件箱中的每个Mailitem上使用AddHandler for PropertyChange,将它们绑定到一个子例程中,该子例程检查PropertyChange事件的参数以确保它是UnRead。看起来相当可行,除了PropertyChange没有传递调用对象的身份,所以我无法知道收件箱中的哪些电子邮件刚刚丢失“未读”状态。

事实上,没有一个Mailitem事件似乎传递了他们的身份,可能是因为有人(MS我猜)假设你首先有一个指向Mailitem对象的直接指针。所以这条路线似乎不起作用。

第2轮: 我可以将收件箱中的所有邮件项目都收集到一个集合中,然后将它们限制为只有未读邮件。

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是Dimmed WithEvents,我可以写一个Sub来处理unreadItems.ItemRemove,这样可以正常工作。但是ItemRemove事件没有对象参数!卫生署!

第3轮: 假设我做了相反的事情:我得到收件箱内容并限制为[Unread] = false,然后使用.ItemAdd事件。这在某种程度上是有效的,除了理论上只要用户从任何文件夹中将“[未读] =假”项目转储到收件箱中,而不仅仅是收件箱中从未读到读取组的更改。所以,除非我在这里误解了一些东西,否则也不是一个选择。

第4轮: 现在,我还想到的只是简单地调暗收件箱项目集合WithEvents并关闭.ItemChange事件,但是这个事件并没有真正指定对象的变化,所以没有骰子。


最后,我非常难过。我非常接近退出目标。一个蹩脚的替代方案是在用户收到来自其中一个指定地址的电子邮件时提醒用户(因为我相信Application.NewMail事件不会给我任何麻烦)。但是,我将不得不提醒用户 - 我不会提示他们打印他们尚未阅读的电子邮件。

这种替代方案是不可取的,我认为我会提出我的问题进行检查和建议。

-Matt

P.S。我来自使用Objective-C制作iPad应用程序,我自己构建了大部分对象层次结构......必须处理具有此类限制的COM对象是很奇怪的。

1 个答案:

答案 0 :(得分:3)

我不太确定您希望自己的用户界面如何表现,因为当用户完成阅读电子邮件时,这一点并不十分清楚。查看它的一种方法是,它们在查看时完成,这意味着检查器窗口显示了邮件,用户正在切换到另一个。要抓住这一点,你可能最好不要看检查员的事件,而不是邮件。 另一种看待它的方法是,只要标记为Read,就会读取邮件。请注意,用户实际上可能会关闭将项目标记为自动读取的选项!这可以在工具 - >选项 - >其他 - >阅读窗格中完成,如下所示:

enter image description here

此外,用户可以选择项目并将其标记为手动阅读,因此您需要考虑在这种情况下您想要做什么。

如果你想观察MailItem的“read”属性的变化,你在第1轮就非常接近了。你需要补充的是你不应该把所有的处理程序都绑定到一个子程序中。单个对象实例。相反,你可以创建自己的类,如下所示(C#代码):

class ItemWatcher
{
    // The Outlook mailitem to watch for
    private Microsoft.Office.Interop.Outlook.MailItem itemBeingWatched = null;

    public ItemWatcher(Microsoft.Office.Interop.Outlook.MailItem item, Form1 parentForm)
    {
        itemBeingWatched = item;
        itemBeingWatched.PropertyChange += new Microsoft.Office.Interop.Outlook.ItemEvents_10_PropertyChangeEventHandler(itemBeingWatched_PropertyChange);
    }

    void itemBeingWatched_PropertyChange(string Name)
    {
        // Respond to property <Name> in the object itemBeingWatched having changed
    }
}

然后,您需要创建ItemWatcher类的集合并将其设置为观看您的电子邮件 请注意,当新邮件到达或旧邮件被删除/移动时,您还需要查看需要添加/删除收藏的项目的项目。