Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events &引用;改为;Outlook 2007 VSTO VB.NET中Mailitem的事件_Events_Outlook_Vsto_Mailitem - Fatal编程技术网

Events &引用;改为;Outlook 2007 VSTO VB.NET中Mailitem的事件

Events &引用;改为;Outlook 2007 VSTO VB.NET中Mailitem的事件,events,outlook,vsto,mailitem,Events,Outlook,Vsto,Mailitem,好吧,这有点棘手 我正在使用VS2010和VSTO以及VB.NET为MS Outlook 2007编写一个外接程序。我的目标是提示用户打印他们从特定电子邮件地址收到的电子邮件。(这将通过一个简单的MsgBox完成。) 具体地说,我希望在用户阅读完电子邮件后得到提示。我的想法是,它的工作原理应该与Outlook中的“读取回执”功能类似。(你知道,那些烦人的事情……“发件人要求你出示收据,证明你读过这封电子邮件,诸如此类的废话”) 因此,用户阅读电子邮件,然后当他们关闭Inspector(或将焦点更

好吧,这有点棘手

我正在使用VS2010和VSTO以及VB.NET为MS Outlook 2007编写一个外接程序。我的目标是提示用户打印他们从特定电子邮件地址收到的电子邮件。(这将通过一个简单的MsgBox完成。)

具体地说,我希望在用户阅读完电子邮件后得到提示。我的想法是,它的工作原理应该与Outlook中的“读取回执”功能类似。(你知道,那些烦人的事情……“发件人要求你出示收据,证明你读过这封电子邮件,诸如此类的废话”)

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

几天来,我一直在谷歌、MSDN和教程网站上关注这一点,以下是我的发现:

第一轮: Mailitem对象有一个未读属性,它还有一个PropertyChange事件。我可以在收件箱中的每个邮件项目上使用AddHandler for PropertyChange,将它们绑定到一个子例程中,该子例程检查PropertyChange事件的参数以确保它未被读取。似乎相当可行,只是PropertyChange没有传递调用对象的身份,所以我无法知道收件箱中的哪封电子邮件刚刚失去了“未读”状态

事实上,似乎所有Mailitem事件都没有传递它们的标识,可能是因为某人(我猜是MS)首先假定您有一个指向Mailitem对象的直接指针。所以这条路线似乎不起作用

第二轮: 我可以将收件箱中的所有邮件抓取到一个集合中,然后将它们仅限于未读邮件

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被Events暗显,因此我可以编写一个子集来处理unreadItems.ItemRemove,这样就可以了。但是ItemRemove事件没有对象参数!啊

第三轮: 假设我做的是相反的:我获取收件箱内容并限制为[Unread]=false,然后使用.ItemAdd事件。这将在一定程度上起作用,但理论上,当用户从任何文件夹将“[Unread]=false”项目转储到收件箱时,它将调用,而不仅仅是收件箱中从Unread组更改为Read组。所以,除非我在这里误解了什么,否则我也没有选择

第四轮: 现在,我也想到了一些简单的事情,就是用events调暗Inbox items集合并退出.ItemChange事件,但是这个事件并没有真正指定对象的更改内容,所以没有骰子


最后,我被这件事难住了。我离我的目标很近了。另一个蹩脚的选择是,当用户收到来自指定地址之一的电子邮件时,提醒用户(因为我相信Application.NewMail事件不会给我带来任何麻烦)。但是,我只需要提醒用户——我不会提示他们打印一封他们甚至还没有读过的电子邮件

这种选择是不可取的,我想我会提出我的问题供检查和建议

-马特


另外,我是从使用Objective-C制作iPad应用而来的,在这里我自己构建了大部分的对象层次结构……处理具有这些限制的COM对象是很奇怪的。

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

此外,用户可以选择项目并将其标记为手动读取,因此您需要考虑在这种情况下要执行的操作

如果您想观察MailItem的“read”属性的变化,那么在第1轮中您已经非常接近了。您需要添加的是,您不应该将所有处理程序绑定到单个对象实例中的单个子例程。相反,您可以创建自己的类,类似这样(C代码):

类项目观察程序
{
//要监视的Outlook邮件项
私有Microsoft.Office.Interop.Outlook.MailItem itemBeingWatched=null;
PublicItemWatcher(Microsoft.Office.Interop.Outlook.MailItem项目,Form1 parentForm)
{
itemBeingWatched=项目;
itemBeingWatched.PropertyChange+=新的Microsoft.Office.Interop.Outlook.ItemEvents\u 10\u PropertyChangeEventHandler(itemBeingWatched\u PropertyChange);
}
void itemBeingWatched_属性更改(字符串名称)
{
//响应正在监视的对象项中的属性已更改
}
}
然后,您需要创建ItemWatcher类的集合,并将它们设置为监视您的电子邮件。

请注意,当新邮件到达或旧邮件被删除/移动时,您还需要关注您需要从关注的邮件集合中添加/删除的邮件。

我不太确定您希望您的UI表现如何,因为不太清楚用户何时阅读完他们的邮件。查看邮件的一种方式是,当他们查看邮件时,他们就完成了,这意味着检查器窗口已经显示了邮件,用户正在切换到另一个邮件。为了抓住这一点,您最好从检查员那里观看事件,而不是邮件。 另一种看待它的方式是,只要邮件被标记为已读,它就会被读取。请注意,用户实际上可能会关闭将项目标记为自动读取的选项!这可以在一个小时内完成
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
    }
}