【问题标题】:How to send all Outlook mail items stored as *.msg in folder如何发送在文件夹中存储为 *.msg 的所有 Outlook 邮件项目
【发布时间】:2019-05-07 10:21:57
【问题描述】:

我有一个程序可以创建多封电子邮件并将它们保存在共享驱动器上的一个文件夹中,该文件夹映射为“Y:”作为 .msg 文件。每封邮件都有不同的收件人、主题和邮件正文。

为了使用我的 Outlook 发送这些消息,我编写了这段代码,但它生成了一个错误“需要对象 424”,并且调试器突出显示了“Set MySource = . . . .”行。有什么建议吗

Sub SendMSGs()

    Dim MyItem As Outlook.MailItem, MySource As Object, file As Variant
    Set MySource = MyObject.GetFolder("Y:\UI_messages\")
    For Each file In MySource.Files
        Set MyItem = file.Name.msg
        MyItem.Send
    Next file

End Sub

【问题讨论】:

  • 什么是MyObject
  • MyObject 应该是一个 FileSystemObject。 Namefile 的属性,但 msg 不是 file.Name 的属性。你的意思是file.Name & ".msg"?如果是这样,属性Name 已经包含扩展名。但是,file.Name 不包含路径,因此您需要添加它。 MyItem 的类型为 MailItemfile.Name 的类型为 String。您不能将 MailItem 设置为 String。查看此答案stackoverflow.com/a/19426859/973283,了解有关将文件名转换为邮件项目的说明。

标签: vba outlook


【解决方案1】:

我没有测试过这段代码,甚至没有尝试编译它。它修复了代码中最明显的错误,因此至少您会得到更好的错误类别。

将文件名转换为邮件项的技术来自:https://stackoverflow.com/a/19426859/973283

此代码需要引用“Microsoft Scripting Runtime”。如果没有这个,FileFolderFileSystemObject 将是未知类型。

Sub SendMSGs()

  Dim FileCrnt As File
  dim FldrCrnt As Folder
  Dim Fso As FileSystemObject
  Dim ItemCrnt As MailItem
  Dim Path As String

  Path = "Y:\UI_messages\"

  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set FldrCrnt = Fso.GetFolder(Path)

  For Each FileCrnt In FldrCrnt.Files
    If LCase(Right$(FileCrnt.Name, 4)) = ".msg" Then 
      Set ItemCrnt = Application.CreateItemFromTemplate(Path & FileCrnt.Name)
      ItemCrnt.Send
    End If
  Next FileCrnt

End Sub

【讨论】:

  • 我试过这段代码,但它产生了这个错误:用户定义的对象没有在“Dim FileCrnt....”行上定义。
  • 抱歉错误是:“未定义用户定义类型。”只是为了让您知道我已经在参考中检查了“Microsoft Outlook 16.0 对象库”。
  • 正如我在代码顶部所说的,这段代码需要“Microsoft Scripting Runtime”。在编辑器中,单击工具,然后单击参考。向下滚动列表(按字母顺序),直到到达“Microsoft Scripting Runtime”。单击左侧的框以勾选它,然后单击“确定”。如果您再次单击工具和参考,“Microsoft Scripting Runtime”将在顶部附近并打勾。 “Microsoft Outlook 16.0 对象库”让您可以访问诸如 MailItem 之类的对象,但无法访问您需要使用 GetFolder 之类的对象,例如 FileSystemObject
  • 没有库,VBA 是一种非常有限的语言。某些库会自动勾选,例如 Outlook 的“Microsoft Outlook 16.0 对象库”和 Excel 的“Microsoft Excel 16.0 对象库”。任何对特定 Office 产品不标准的内容都必须明确引用。如果您去寻找代码,请检查它需要哪些参考。一些作者忘记提及所需的库。如果您收到一条消息说“xxxxxx”是未定义的用户类型,请查找“xxxxxx”,您应该能够找到一个网站,告诉您哪个库定义了它。
  • @0m3r 我同意Dim FldrCrnt As Object 会避免这个问题。然而,一般来说,正确键入变量会减少模糊错误的发生率。不输入对象有帮助的一种情况并不是这个好建议。
【解决方案2】:

应该是 - 例子

Option Explicit
Sub SendMSGs()
    Dim MyItem As Outlook.MailItem

    Dim MyObject As Object
    Set MyObject = CreateObject("Scripting.FileSystemObject")

    Dim MySource As Object
    Set MySource = MyObject.GetFolder("C:\Temp\")

    Dim oFile As Object
    For Each oFile In MySource.Files
        If LCase(Right$(oFile.Name, 4)) = ".msg" Then
            Set MyItem = Application.CreateItemFromTemplate("C:\Temp\" & oFile.Name)
            MyItem.Display
        End If
    Next oFile

End Sub

尝试使用Option Explicit

@Tony Dallimore Answer 应该可以将 Dim FldrCrnt As Folder 更改为 Dim FldrCrnt As Object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多