2017-02-20 35 views
2

我正在Outlook VBA中編寫一個腳本,以便在Access數據庫中記錄每封電子郵件,因爲它們會進入我的收件箱。我有觸發器沒有問題的代碼。它訪問Access數據庫沒有問題。它複製主題沒有問題。然後它到達身體並且根本不復制。我已經嘗試了諸如.HTMLbody之類的東西,而不僅僅是.Body,但是這又顯示了一個空的主體。我的代碼如下:VBA Outlook 2010收到的郵件.Body爲空

Option Explicit 
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 
Dim objNS As Outlook.NameSpace 
Dim objEmail As Outlook.MailItem 
Dim strIDs() As String 
Dim intX As Integer 
Dim ws As DAO.Workspace 
Dim db As DAO.Database 
Dim sDb As String 
Dim sSQL As String 
Dim qdf As QueryDef 
strIDs = Split(EntryIDCollection, ",") 
For intX = 0 To UBound(strIDs) 
Set objNS = Application.GetNamespace("MAPI") 
Set objEmail = objNS.GetItemFromID(strIDs(intX)) 
    sDb = "C:\Users\######\Documents\EmailDatabase.accdb" 
    Set ws = DBEngine.Workspaces(0) 
    Set db = ws.OpenDatabase(sDb) 
    sSQL = "INSERT INTO AllEmails (Subject,Message) Values ('" & objEmail.Subject & "','" & objEmail.HTMLBody & "')" 
    Set qdf = db.CreateQueryDef("", sSQL) 
    qdf.Execute dbFailOnErro 
MsgBox objEmail.HTMLBody 
Next 
Set objEmail = Nothing 
End Sub 

如果有人有任何想法我做錯了,請讓我知道。三小時的谷歌搜索似乎沒有對它進行排序!

+0

你的消息框還沒有返回? – Jordan

+0

是@Jordan消息框打開(所以沒有錯誤拋出),但沒有任何內容。 – codeacker

+0

逐步通過您的代碼(F8)並在分配後在您的本地窗口中查看'objEmail'。當你展開變量時,看看是否還有'body'屬性。想知道'GetItemFromID'實際上是否返回了'MailItem' –

回答

0

嘗試從NewMailEx事件處理程序中刪除任何額外的代碼(Access)。請謹慎使用此方法,以儘量減少對Outlook性能的影響。但是,根據客戶端計算機上的設置,新郵件到達收件箱後,像垃圾郵件過濾和客戶端規則這樣的過程將新郵件從收件箱移動到另一個文件夾可能會異步發生。您不應該認爲在這些事件觸發後,收件箱中的項目數量總會增加一個項目。

EntryIDsCollection字符串包含與該項目對應的條目ID。請注意,當EntryIDCollection包含自上次事件觸發以來收件箱中收到的所有項目的逗號分隔條目ID列表時,此行爲已從早期版本的事件更改。

+0

感謝@eugene您的MSDN鏈接解釋說NewMailEx適用於POP3賬戶而非IMAP。所以也許最好的方法是創建一個規則來收到郵件時運行腳本?那麼我將如何識別該電子郵件? – codeacker

+0

在這種情況下,MailItem的一個實例被傳遞給VBA宏。規則不需要使用'GetItemFromId'方法。 –

+0

我試過了,它再次得到沒有問題的主題,但不是身體。這意味着它不能下載消息,直到它被預覽或打開。現在我要嘗試在這一點上觸發它...更多谷歌需要:) – codeacker

相關問題