我正在尝试运行一个宏,可以在Outlook启动时将今天之前收到的电子邮件移动到cabinet文件夹。问题是Application_Startup
事件处理程序在Outlook完全加载并且文件夹已同步之前发生。因此,当我在早上打开Outlook时,昨晚发来的所有电子邮件都没有移到内阁。
为了解决这个问题,我创建了一个自定义类来实例化Outlook.syncObject
,它同步所有文件夹并在同步完成时提供事件处理程序。我在Application_Startup
事件处理程序中从此类创建了一个对象。但是,此同步似乎实际上并未检索任何电子邮件,并且在Outlook加载之前似乎即可完成。
似乎能够在Outlook完成全部之后执行代码,它的启动过程将是一个常见的功能请求。谢谢你的帮助。
此示例代码只显示我的收件箱中有多少未读电子邮件。如果我关闭Outlook,给自己发送电子邮件,然后打开Outlook,我需要加载Outlook并在生成包含收件箱中未读电子邮件数量的邮箱之前进行完全同步。
Oulook Application_Startup
事件处理程序:
Dim mySyncInstance As New mySync
Private Sub Application_Startup()
mySyncInstance.Initialize_handler
End Sub
自定义mySync类代码:
Dim WithEvents mySync As Outlook.syncObject
Sub Initialize_handler()
Set mySync = Application.Session.SyncObjects.item(1)
mySync.Start
End Sub
Private Sub mySync_SyncEnd()
MsgBox Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).items.Restrict("[UnRead] = True").Count & _
" Emails are unread in the main inbox."
End Sub
答案 0 :(得分:0)
为什么不在收件箱文件夹中使用Items.ItemAdd事件?
答案 1 :(得分:0)
我试图运行一个宏,在Outlook启动时将今天之前收到的电子邮件移动到cabinet文件夹。
您可以考虑处理在收件箱中收到新项目时触发的Application类的NewMailEx事件。因此,您可以获取邮件项目并决定是否需要在子文件夹中移动它。对于Microsoft Outlook处理的每个接收项,此事件将触发一次。该项可以是几种不同项类型之一,例如,MailItem,MeetingItem或SharingItem。 EntryIDsCollection字符串包含与该项对应的条目ID。
您还可以创建规则并分配VBA宏子。邮件项目对象的传入实例将作为参数传递。例如:
public sub test(mail as MailItem)
' do whatever you need
end sub
作为替代方法,您可以处理在将一个或多个项目添加到指定集合时触发的Items类的ItemAdd事件。当大量项目一次添加到文件夹(超过16个)时,此事件不会运行。