【问题标题】:Downloading and then extracting zipped attachments using an Outlook rule使用 Outlook 规则下载并提取压缩附件
【发布时间】:2016-05-23 18:57:06
【问题描述】:

我有一个相当直接的场景,我每天都会收到一封附有 zip 文件的电子邮件,我希望能够更轻松地解析这些信息。为此,我只需要将附件下载到文件夹中,然后解压缩即可。

要下载附件,我做了以下操作

Public Sub SaveZip(itm As Outlook.MailItem)

Dim objAtt As Outlook.Attachment
Dim saveFolder As String

saveFolder = "c:\temp\"

For Each objAtt In itm.Attachments
    objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
    Set objAtt = Nothing
Next


End Sub

这按预期工作,.zip 文件被转储到临时目录中。我发现以下代码似乎是我需要实现以提取 .zip

Set oApp = CreateObject("Shell.Application")
oApp.NameSpace(saveFolder).CopyHere oApp.NameSpace.Items

在不产生大量错误的情况下,我无法在现有代码中实现这一点(我敢肯定,由于我自己缺乏理解)

对此的任何意见将不胜感激

最终编辑

知道了,感谢蒂姆的所有帮助。下面将从收到的电子邮件中下载附件(始终命名相同)到 c:\temp,将它们解压缩到 c:\temp\unzipped,重命名文件,最后删除 c:\temp 中的 .zip。

Public Sub SaveZip(itm As Outlook.MailItem)

    Const saveFolder = "C:\Temp\"
    Const fileFolder = "C:\CBH\"

    Dim objAtt As Outlook.Attachment
    Dim oApp As Object
    Dim dName As Variant


    For Each objAtt In itm.Attachments

        dName = objAtt.DisplayName

        objAtt.SaveAsFile saveFolder & dName

        Set oApp = CreateObject("Shell.Application")

        oApp.NameSpace("C:\CBH").CopyHere _
           oApp.NameSpace(saveFolder & dName).Items
        Name fileFolder & "CallsByHour.xls" As fileFolder & "CBH-" & Format(Date, "yyyymmdd") & ".xls"
        Kill saveFolder & dName

    Next

End Sub

【问题讨论】:

  • Dim saveFolder:删除As String,如此处所述rondebruin.nl/win/s7/win002.htm
  • 您需要将完整路径传递给 zip 存档 ... oApp.NameSpace(fullZipPathGoesHere).Items 该路径也应该是 Variant。
  • 我继续将路径变量 (saveFolder) 放在那里,而不是出现错误,什么也没有发生。我假设这是因为我需要在路径中包含一个文件名?
  • 是的 - 您需要包含 zip 文件名的完整路径。将有助于使用当前版本的代码更新您的问题。

标签: vba outlook zip


【解决方案1】:

假设您在 Outlook 中编码,这将处理在 Outlook 中选择的项目,将附件保存到 C:\Temp 并将 zip 内容提取到 C:\Temp\unzipped

EDIT(未经测试) - 添加了基于日期时间的子文件夹

Sub Tester()

    SaveZip Application.ActiveExplorer.Selection.Item(1)

End Sub


Public Sub SaveZip(itm As Outlook.MailItem)

    Const saveFolder = "C:\Temp\"

    Dim objAtt As Outlook.Attachment
    Dim oApp As Object
    Dim dName As Variant, unZipFolder

    If itm.Attachments.Count > 0 Then

        unZipFolder = saveFolder & "unzipped\" & " _
                      Format(Now,"yyyymmdd_hhmss")

        MkDir unZipFolder 

        For Each objAtt In itm.Attachments

            dName = objAtt.DisplayName

            objAtt.SaveAsFile saveFolder & dName

            Set oApp = CreateObject("Shell.Application")

            oApp.NameSpace(unZipFolder).CopyHere _
               oApp.NameSpace(saveFolder & dName).Items

        Next
    End If     'any attachments
End Sub

【讨论】:

  • 这和我描述的完全一样。看来我的错误在于理解部分代码的复制。我可以添加什么来为文件添加日期戳吗?我突然想到我每天都会覆盖它们。
  • 看起来它可以工作,但我试图让来自 zip 的实际文件重命名,以试图最终得到这些文件的目录,而不是一堆目录每个。
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2014-07-16
相关资源
最近更新 更多