【问题标题】:Accessing the ‘Body’ of an Outlook email from Excel VBA从 Excel VBA 访问 Outlook 电子邮件的“正文”
【发布时间】:2020-10-06 03:31:11
【问题描述】:

从 W7 上的 Office 2010 升级到 W10 上的 Office 365 后,以下代码停止工作。

Sub readbodytest()

    Dim OL As Outlook.Application
    Dim DIB As Outlook.Folder
    Dim i As Object 'Outlook.ReportItem
    Dim Filter As String

    Set OL = CreateObject("Outlook.Application")
    Set DIB = OL.Session.GetDefaultFolder(olFolderInbox)

    Const PR_SENT_REPRESENTING_EMAIL_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x0065001E"
    Filter = "@SQL=" & _
        """" & PR_SENT_REPRESENTING_EMAIL_ADDRESS & """ ci_phrasematch 'mailer-daemon' OR " & _
        """" & PR_SENT_REPRESENTING_EMAIL_ADDRESS & """ ci_phrasematch 'postmaster' OR " & _
        "urn:schemas:httpmail:subject ci_phrasematch 'undeliverable' OR " & _
        "urn:schemas:httpmail:subject ci_phrasematch 'returned'"
    For Each i In DIB.Items.Restrict(Filter)
        Debug.Print i.Body '<< Code fails here
    Next

    Set i = Nothing
    Set DIB = Nothing
    Set OL = Nothing
End Sub

它返回运行时错误-2147467259“对象'_MailItem'的方法'Body'失败”

代码直接在outlook VBA中运行时有效,但在外部运行时无效。

代码的目的是对返回的邮件进行批量审查,将电子邮件正文中的信息与数据库中的记录相匹配,并更新数据库以记录失败。

在我重新编写代码以反向运行之前看看是否有人有任何建议(例如,从 Outlook VBA 到数据库;而不是数据库试图从 Outlook 中检索它)

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    使用 Application 类的 Logon 方法将用户登录到 MAPI 以获取 MAPI 会话是有意义的。这是 MSDN 所说的:

    仅在 Outlook 尚未运行时使用登录方法登录到特定配置文件。这是因为一次只能运行一个 Outlook 进程,并且该 Outlook 进程只使用一个配置文件并且只支持一个 MAPI 会话。当用户第二次启动 Outlook 时,该 Outlook 实例在同一个 Outlook 进程中运行,不会创建新进程,而是使用相同的配置文件。

    如果 Outlook 未运行并且您只想使用默认配置文件启动 Outlook,请不要使用登录方法。下面的代码示例 InitializeMAPI 显示了一个更好的替代方法:首先,实例化 Outlook 应用程序对象,然后引用一个默认文件夹,例如收件箱。这具有初始化 MAPI 以使用默认配置文件并使对象模型完全正常工作的副作用。

    其次,我建议在访问任何属性之前检查项目类型。并非所有项目都可能包含此类属性。

    另一个可能的陷阱,很可能是处理 Outlook 对象模型时的安全问题。当您尝试访问任何敏感属性时,Outlook 可能会触发安全问题(可能是代码或 UI 防护/提示中的错误)。本文中的“安全”是指所谓的“对象模型保护”,它触发安全提示并阻止对某些功能的访问,以防止恶意程序从 Outlook 数据中获取电子邮件地址并使用 Outlook 传播病毒和垃圾邮件。您可以使用以下方法来弥补差距:

    1. Security Manager for Outlook 组件允许在运行时关闭/打开提示。

    2. 使用不生成安全提示的低级代码。或围绕该 API 的任何其他第三方包装器(例如 Redemption)。

    3. 部署组策略以避免安全提示。

    4. 运行最新的防病毒软件。

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多