【问题标题】:Save email attachment based on email subject根据电子邮件主题保存电子邮件附件
【发布时间】:2020-06-24 17:27:12
【问题描述】:

每天上午 12 点,都会自动收到一封来自供应商服务的带有特定主题的 Excel 附件的电子邮件。我正在使用规则和代码来尝试保存附件并将信息插入到我在收件箱中收到时创建的数据库中。

我尝试了我在网上找到的代码,但我不知道是否因为我公司的某些网络/安全设置而无法正常工作,或者是他自己编写的代码。

规则:

代码:

Public Sub CribMaster2Database(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String

saveFolder = "c:\temp\"
    If olItem.Subject = "Test" Then
        For Each objAtt In itm.Attachments
            objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
            Set objAtt = Nothing
        Next
    End If

End Sub

【问题讨论】:

  • 是时候学习调试了!你如何运行代码?你怎么知道代码是否运行?你怎么知道你有问题?有什么问题?设置调试点并使用调试器或添加 MsgBox 语句!但是......我的第一个真正问题是“你是如何让你的宏运行的?”
  • Tun 运行这样的宏,根据您的安全设置,您必须创建一个证书并选择它来签署您的VBA 代码。查找 Digital Certificate for VBA Projects 以创建证书。在Outlook VBA 中,菜单是Tools/Digital Signature。最后,您必须使用 Outlook Rules Wizard 来触发您的脚本来处理收到的邮件。
  • 使用 Outlook 内置的规则和警报功能
  • 您的保存文件夹不正确 - 您正在添加额外的路径分隔符。 saveFolder & "\" & objAtt.DisplayName - saveFolder 已经有一个最终的 \ 所以这将显示为 c:\temp\\MyFileName.xls

标签: vba outlook


【解决方案1】:

将代码添加到 ThisOutlookSession 以监视您的文件夹是否到达。
CribMaster_ItemAdd 会在您监视的文件夹中到达时触发。

在模块的最顶部:

Dim WithEvents CribMaster As Items

Const SAVE_PATH As String = "c:\temp\"

Private Sub Application_Startup()

    Dim ns As Outlook.NameSpace
    Set ns = GetNamespace("MAPI")

    'Change `holi4683` to the name of your account
    '(should be visible just above your inbox).
    Set CribMaster = ns.Folders.Item("holi4683") _
            .Folders.Item("Inbox").Items

End Sub

Sub CribMaster_ItemAdd(ByVal Item As Object)
    Dim olAtt As Attachment
    Dim i As Integer

    With Item
        For i = 1 To .Attachments.Count
            Set olAtt = .Attachments(i)
            olAtt.SaveAsFile SAVE_PATH & olAtt.DisplayName
            .UnRead = False
            DoEvents
        Next i
    End With
    Set olAtt = Nothing

End Sub  

我通常会使用规则将电子邮件移动到子文件夹并观看该文件夹 - 这意味着我不必担心会议邀请等。
为此,您需要像这样更改您的监视文件夹:

Set CribMaster = ns.Folders.Item("holi4683") _
        .Folders.Item("Inbox") _
        .Folders.Item("SubFolder").Items  

重新启动 Outlook 以使代码正常工作,或手动运行 Application_Startup() 过程。

【讨论】:

  • 所以我不再使用规则来触发脚本了?
  • 抱歉,看不到您的规则图片。不,您不必使用该规则,因为当物品到达您的收件箱时代码会触发。目前它会针对所有项目触发,因此您可能需要设置一个规则以将特定电子邮件移动到另一个文件夹中并在它们到达时查看或检查电子邮件的主题行。
  • 好的,我更改了规则,将电子邮件放入名为 CribMaster 的文件夹中。现在,当我运行代码时,我在第 10 行出现错误:Run time error 438: Object doesn't support this property or method 我有以下内容`Set CribMaster = ns.Folders.Item("name of account").Folders.Item("Inbox").Folders。 Item("CribMaster").Items `
  • 不确定。您有ThisOutlookSession 中的代码吗?您的*文件夹在代码中正确命名 - 可能是您的电子邮件地址?它是什么版本的 Outlook?这是 2010 年写的。
  • 是的,是的,2013 年