【问题标题】:vbscript to save attachment from Outlook only saves 2 emails从 Outlook 保存附件的 vbscript 仅保存 2 封电子邮件
【发布时间】:2022-03-18 18:00:25
【问题描述】:

我有这个脚本可以自动将 Outlook 中的附件保存在一个文件夹中,但它一次只能保存 2 封电子邮件中的附件。如何将其增加到 3 或 4?

Const olFolderInbox = 6

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objMailbox = objNamespace.Folders("Mailbox - ABC")
Set objFolder = objMailbox.Folders("Inbox")

Set colItems = objFolder.Items
Set colFilteredItems = colItems.Restrict("[UnRead] = True")

For Each objMessage in colFilteredItems
    intCount = objMessage.Attachments.Count
    If intCount > 0 Then
        For i = 1 To intCount
            objMessage.Attachments.Item(i).SaveAsFile "C:\" &  _
                objMessage.Attachments.Item(i).FileName
        Next 
    End If
    objMessage.Unread = False
Next

【问题讨论】:

  • Item(i).FileName 可能为空或无效。您可以尝试Item(i).DisplayName 或创建一个人工名称,如"att" & i & ".dat"。使用Debug.print 记录名称。不建议将文件直接写入“C:\”。你可能会破坏你的系统。获取另一个您有足够访问权限的目录。检查Attachment.Type 属性并跳过嵌入式附件(olEmbeddedItem = 5)。它们不能保存为文件。
  • @Axel 谢谢,我会尝试显示名称并跳过嵌入式项目,看看它是否有效
  • @Axel - 不起作用。问题似乎是它不检查超过 2 封电子邮件。一旦它查看电子邮件,它就会下载所有附件。因此,如果我有 3 封带附件的未读电子邮件,它只会阅读 2 封电子邮件并留下第三封。
  • 如果您正在循环浏览一个文件夹,则可能有没有 MailItems 的项目对象。使用if objMessage.Class = olMail then ... 避免错误。
  • 这段代码看起来很可靠,可能是 saveasfile 命令需要很长时间才能处理,或者您的错误处理没有任何指示。也许在“SaveAsFile”命令之后添加“if err.number 0 then msgbox err.description”?

标签: email vbscript outlook


【解决方案1】:

试试这个,适用于主收件箱中的电子邮件:

Set outlook = createobject("outlook.application")
Set session = outlook.getnamespace("mapi")
session.logon

Set inbox = session.getdefaultfolder(6) // inbox is 6

For Each m In inbox.items
  If m.unread  Then 
    intCount = m.Attachments.Count
    If intCount > 0 Then
        For i = 1 To intCount
            m.Attachments.Item(i).SaveAsFile "C:\pic\" &  _
                m.Attachments.Item(i).FileName
        Next 
    End If
    m.Unread = False
  End If
Next

session.logoff

Set outlook = Nothing
Set CaseTitle = Nothing
Set session = Nothing

WScript.Quit

如果您想在收件箱中获取文件夹的附件,只需输入以下行:

Set inbox = session.getdefaultfolder(6).Folders("FolderName")

【讨论】:

  • 不要遍历文件夹中的所有项目 - 可能有数万个。
  • 一开始,用户必须将所有包含附件的相关电子邮件“标记为未读”。这样,就不会考虑不必要的电子邮件。我实际上已经为成千上万的人尝试过这段代码。如果用户将相关邮件标记为未读邮件,它不会崩溃。
  • 关闭缓存模式并针对包含数千封电子邮件的文件夹运行脚本。一旦获得,不要这样做。这就是 Items.Restrict 和 Items.Find/FindNext 的用途。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2017-08-28
  • 2016-11-10
相关资源
最近更新 更多