【发布时间】:2020-06-23 16:32:14
【问题描述】:
我正在尝试同步两个outlook文件夹(一个是共享邮箱,另一个是个人自定义文件夹) 我的主要目标是至少每次“原始”共享文件夹收到应复制到“目标”自定义文件夹中的新邮件时,让这两个文件夹同步。
我能够在特定时间间隔内(例如当天)检索原始共享邮箱中的所有邮件消息
Private ons As Outlook.NameSpace
Dim sourceFolder As Outlook.Folder
Dim sourceFolderRecipient As Outlook.Recipient
Set sourceFolderRecipient = ons.CreateRecipient("sharedAccount@myDomain.com")
Set sourceFolder = ons.GetSharedDefaultFolder(sourceFolderRecipient, olFolderInbox)
Dim sourceFolderMails As Outlook.items
Set sourceFolderMails = sourceFolder.items
Dim sourceFolderMail As Outlook.MailItem
Dim strFilter As String
strFilter = "[SentOn] > '" & Date & "'"
Set sourceFolderMails = sourceFolderMails.Restrict(strFilter)
我也可以复制目标文件夹中 sourceFolderMails 列表中的所有邮件
不幸的是,当有新邮件到达时,再次调用该函数,它将复制目标文件夹中的所有邮件以及新邮件。
有没有办法过滤 sourceFolderMails,如 sourceFolderMails.Restrict("all Subject and SentOn messages different from a list") 或其他仅复制新邮件/邮件的解决方案?
更多信息
每次有新消息到达时都会调用我的同步函数(触发ItemAdd 事件)。我尝试使用两个嵌套的For Each item In items 用于比较Subject 和SentOn 属性的sourceFolderMails 和destinationFolderMails 项目容器。它有效,但SentOn 比较导致宏将执行时间从不到一秒增加到超过 30 秒,这是不可行的,因为我必须检查多达六个共享邮件文件夹。 (Subject 比较不会影响执行时间,而像 Size 这样的其他属性会影响执行时间,这就是为什么我正在寻找一种不同的方法来过滤检索到的邮件列表,例如使用 items.Restrict(filter) )。
更新
考虑到有一些 MailItem 属性可以在不影响执行时间的情况下进行比较(至少 Subject 和 EntryID),一个可能的解决方案可以在复制的邮件上复制原始项目 EntryID(因为它在邮件复制后会更改)
Dim objCopy As Outlook.MailItem
Dim EntryID2Property As Outlook.UserProperty
Set objCopy = sourceFolderMail.Copy
Set EntryID2Property = objCopy.UserProperties.Add("EntryID2", olText)
EntryID2Property.Value = sourceFolderMail.EntryID
objCopy.Save
objCopy.Move destinationFolder
可以添加自定义属性,然后与原始EntryID进行比较
If (sourceFolderMail.Subject = destinationFolderMail.Subject) And (sourceFolderMail.EntryID = destinationFolderMail.UserProperties.Find("EntryID2")) Then
不幸的是,自定义属性比较与 SendOn 一样慢。 在将复制邮件与原始邮件进行比较后,我将继续寻找检测复制邮件的最佳方法。
【问题讨论】:
-
请注意:您也许可以在 OWA 上设置规则来完成此操作
-
如果您不使用规则或 ItemAdd 的内置功能,在嵌套循环中,您可以通过 Subject 和 SentOn 将
sourceFolderItems.Restrict(strFilter)中的每个项目与相应 @ 中的所有项目进行比较987654335@。不匹配时复制。 -
OWA 规则将是最快的解决方案,但管理策略不可用,因为它会增加服务器流量并导致磁盘空间问题。我已经为 sourceFolderMails 和 destinationFolderMails 项目容器尝试了两个嵌套的“For Each item In items”,比较 Subject 和 SentOn。它可以工作,但 SentOn 比较会导致宏将执行时间增加到 30 秒以上,这是不可行的,因为我必须检查多达六个共享邮件文件夹。 (主题比较不会影响执行时间,而 Size 等其他属性会影响执行时间)。
-
如果您想保存 EntryID 以进行比较,请尝试docs.microsoft.com/en-ca/office/vba/api/outlook.userproperties