我在尝试通过 VBA(在 excel 中)访问 Outlook 邮件时遇到了类似的情况。但是,在我的情况下它要慢得多:每秒 1 封电子邮件!(由于我在 VBA 上实现了它,因此我的情况可能比您的情况慢)。
无论如何,我成功地通过使用 SetColumnns 提高了速度(例如https://docs.microsoft.com/en-us/office/vba/api/Outlook.Items.SetColumns)
我知道..我知道..这仅适用于少数属性,例如“主题”和“接收时间”,不适用于正文!但再想一想,你真的想通读所有电子邮件的正文吗?或者它只是一个子集?也许基于它的“主题”行或“接收时间”?我的要求是进入电子邮件正文,以防其主题与特定字符串匹配!
因此,我做了以下事情:
我添加了第二个名为“myFilterItemCopyForBody”的“Outlook.Items”obj,并应用了与另一个“Outlook.Items”相同的过滤器。所以,现在我有两个“Outlook.Items”:“myFilterItem”和“myFilterItemCopyForBody”,它们都具有相同的电子邮件项目,因为两者都应用了相同的限制条件。
'myFilterItem'- 仅保存相关邮件的 'Subject' 和 'ReceivedTime' 属性(使用 SetColumns 完成) 'myFilterItemCopyForBody'- 保存邮件的所有属性(包括正文)
现在,'myFilterItem' 和 'myFilterItemCopyForBody' 都使用 'ReceivedTime' 进行排序,以使它们具有相同的顺序。
排序后,两者都会在每个循环的嵌套中同时循环,并选择相应的属性(在计数器的帮助下),如下面的代码所示。
Dim myFilterItem As Outlook.Items
Dim myItems As Outlook.Items
Set myItems = olFldr.Items
Set myFilterItemCopyForBody = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
Set myFilterItem = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
myFilterItemCopyForBody.Sort ("ReceivedTime")
myFilterItem.Sort ("ReceivedTime")
myFilterItem.SetColumns ("Subject, ReceivedTime")
For Each myItem1 In myFilterItem
iCount = iCount + 1
For Each myItem2 In myFilterItemCopyForBody
jCount = jCount + 1
If iCount = jCount Then
'Display myItem2.Body if myItem1.Subject contain a specific string
'MsgBox myItem2.Body
jCount = 0
Exit For
End If
Next myItem2
Next myItem1
注意 1:请注意,使用与“myFilterItemCopyForBody”对应的“myItem2”访问 Body 属性。
注2:编译器进入循环访问body属性的次数越少越好!您可以通过使用 Restrict 和逻辑来进一步提高效率,以降低编译器必须循环遍历逻辑的次数。
希望这会有所帮助,即使这不是什么新鲜事!