从 Outlook 检索电子邮件的脚本

Posted

技术标签:

【中文标题】从 Outlook 检索电子邮件的脚本【英文标题】:Script for retrieving emails from Outlook 【发布时间】:2015-09-07 09:22:40 【问题描述】:

这是我从 Outlook 收件箱中检索电子邮件并存储其附件的脚本。

问题是无法正常工作。它能够从未读的电子邮件中收集附件并将它们存储到SavePath,但是当它阅读了三封电子邮件时它就停止了。

奇怪的是,它再次执行时能够收集剩余的邮件,但不能收集所有剩余的未读邮件。

例如: 我在收件箱中有 6 封未读电子邮件,第一次执行时只读取了 3 封电子邮件并收集了它们的附件。第二次执行时,它会读取接下来的 2 封电子邮件。第三次执行时,读取了剩余的邮件。

我不知道发生了什么以及为什么不一次阅读所有电子邮件。

Dim SavePath
Dim Subject
Dim FileExtension

SavePath = "C:\IN\"
Subject = "'Transfer File'"
FileExtension = "ARmessage"

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(6) 'Inbox

Set colItems = objFolder.Items
Set colFilteredItems = colItems.Restrict("[Unread]=true")
Set colFilteredItems = colFilteredItems.Restrict("[Subject] = " & Subject)

For Each objMessage In colFilteredItems
    intCount = objMessage.Attachments.Count
    If intCount > 0 Then
        For i = 1 To intCount
            ' if right(Ucase(objMessage.Attachments.Item(i)),9) = FileExtension then
                objMessage.Attachments.Item(i).SaveAsFile SavePath &  _
                    objMessage.Attachments.Item(i).FileName
            ' End If
        Next
        objMessage.Unread = False
    End If
Next

【问题讨论】:

【参考方案1】:

不要将“for each”用于您正在更改的集合 - 受限集合是动态的,当您将消息标记为已读时,集合会更改。使用向下的“for”循环:

dim k
For k = colFilteredItems.Count to 1 step -1
  set objMessage  = colFilteredItems.Item(k)
  ...
next 

【讨论】:

感谢您的回复德米特里。应用您的建议后,它现在会启动“语法错误”消息。 现在我得到这个错误:Invalid loop control variable 哦,等一下,您还有另一个使用“I”的循环。对循环变量使用舒缓的 else(见上文) 天啊!我没有意识到。最后它就像一个魅力一样工作。谢谢德米特里!

以上是关于从 Outlook 检索电子邮件的脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R RDCOMClient 检索 Outlook 收件箱电子邮件?

从 python 脚本发送时,Outlook 中的电子邮件附件名称始终为“AT00001.xlsx”而不是实际名称

Powershell 脚本无法使用任务计划程序通过 Outlook 发送电子邮件

尝试从 Outlook 存档电子邮件文件

从 Outlook 邮件中提取压缩文件

使用列表邮件时,Outlook 邮件 API 返回拼写检查类名称作为 html 响应的一部分