从Excel VBA中访问Outlook电子邮件的 "正文"。

问题描述 投票:0回答:1

从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 office365 outlook-vba
1个回答
0
投票

使用Application类的Logon方法是有意义的,它可以将用户登录到MAPI上,获得一个MAPI会话。MSDN是这样说的。

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

如果Outlook没有运行,而你只想用默认的配置文件启动Outlook,不要使用登录方法。下面的代码示例InitializeMAPI中显示了一个更好的替代方法:首先,实例化Outlook应用程序对象,然后引用一个默认的文件夹,如Inbox。这样做的副作用是初始化MAPI使用默认的配置文件,并使对象模型充分发挥作用。

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

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

  1. Outlook的安全管理器 组件允许在运行时关闭提示。

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

  3. 部署一个组策略来避免安全提示。

  4. 运行最新的杀毒软件。

© www.soinside.com 2019 - 2024. All rights reserved.