【问题标题】:Outlook VBA macro to synchronize two foldersOutlook VBA 宏同步两个文件夹
【发布时间】: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 用于比较SubjectSentOn 属性的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 等其他属性会影响执行时间)。
  • 你可以指出你尝试了什么。 How to create a Minimal, Complete, and Verifiable example
  • 如果您想保存 EntryID 以进行比较,请尝试docs.microsoft.com/en-ca/office/vba/api/outlook.userproperties

标签: vba outlook


【解决方案1】:

您可以使用源文件夹上的Items.ItemAdd 事件来复制传递给事件处理程序的项目。

当新消息到达源文件夹时,您的代码当然必须正在运行。

【讨论】:

  • 谢谢,ItemAdd 事件已经是宏的一部分,用于在新消息到达时触发我的同步功能。不幸的是,这还不够,因为在 Outlook 启动时或 PC 待机几分钟后,我需要检索所有新邮件,而不仅仅是最后一封。
  • 您可以存储您处理的最新一批电子邮件的 CreationTime(文件?注册表?)的最高值,并在检索下一批时使用它的值。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2020-02-11
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多