簡體   English   中英

從 Excel Z6E3EC7E6A9F79007B098AFCZ 訪問 Outlook email 的“主體”

[英]Accessing the ‘Body’ of an Outlook email from Excel VBA

從 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 “object '_MailItem' 的方法 'Body' 失敗”

代碼直接在 outlook VBA 中運行時可以工作,但在外部運行時則不行。

代碼的目的是對退回的郵件進行批量審查,將 email 的正文中的信息與數據庫上的記錄匹配,並更新數據庫以記錄失敗。

在我重新編寫代碼以反向運行之前看看是否有人有任何建議(例如,從 Outlook VBA 到數據庫;而不是數據庫試圖從 Outlook 檢索它)

使用應用程序 class 的登錄方法是有意義的,該方法將用戶登錄到 MAPI,獲得 MAPI session。 這是 MSDN 所說的:

當 Outlook 尚未運行時,僅使用登錄方法登錄到特定配置文件。 這是因為一次只能運行一個 Outlook 進程,而 Outlook 進程只使用一個配置文件,並且只支持一個 MAPI session。 當用戶第二次啟動 Outlook 時,該 Outlook 實例在同一 Outlook 進程中運行,不會創建新進程,並使用相同的配置文件。

如果 Outlook 未運行,並且您只想使用默認配置文件啟動 Outlook,請不要使用登錄方法。 下面的代碼示例 InitializeMAPI 顯示了更好的替代方法:首先,實例化 Outlook 應用程序 object,然后引用默認文件夾,例如收件箱。 這具有初始化 MAPI 以使用默認配置文件並使 object model 功能齊全的副作用。

其次,我建議在訪問任何屬性之前檢查項目類型。 並非所有項目都可能包含此類屬性。

在處理 Outlook object model 時,另一個可能的陷阱很可能是一個安全問題。 當您嘗試訪問任何敏感屬性時,Outlook 可能會觸發安全問題(可能是代碼或 UI 保護/提示中的錯誤)。 "Security" in this context refers to the so-called "object model guard" that triggers security prompts and blocks access to certain features in an effort to prevent malicious programs from harvesting email addresses from Outlook data and using Outlook to propagate viruses and spam. 您可以使用以下方法來彌補差距:

  1. Outlook 組件的安全管理器允許在運行時關閉/打開提示。

  2. 使用不生成安全提示的低級代碼。 或圍繞該 API 的任何其他第三方包裝器(例如,兌換)。

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

  4. 運行最新的防病毒軟件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM