2017-02-20 27 views
2

Я пишу сценарий в Outlook VBA для записи каждого письма в базе данных Access, когда они входят в мой почтовый ящик. В коде у меня триггеры без проблем. Он обращается к базе данных Access без проблем. Он копирует тему без проблем. Затем он добирается до тела и ничего не копирует. Я пробовал такие вещи, как .HTMLbody, а не просто. Боди, но это снова показывает пустое тело. Мой код выглядит следующим образом:VBA Outlook 2010 получил почту .Body is empty

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 

Если кто-нибудь знает, что я делаю неправильно, пожалуйста, дайте мне знать. Кажется, что три часа работы в Google не отсортировали его!

+0

Является ли ваше окно сообщений также ничего не возвращающим? – Jordan

+0

Да @Jordan открывается окно сообщения (поэтому не было отказано), но ничего в нем не было. – codeacker

+0

Пройдите через свой код (F8) и просмотрите 'objEmail' в окне локалей после того, как он назначен. Посмотрите, есть ли даже свойство 'body', когда вы расширяете переменную. Удивительно, если 'GetItemFromID' на самом деле возвращает' MailItem' –

ответ

0

Попробуйте удалить любой дополнительный код (Access) из обработчика событий NewMailEx. Используйте этот метод с осторожностью, чтобы свести к минимуму влияние на производительность Outlook. Однако в зависимости от настройки на клиентском компьютере после поступления нового сообщения в папку «Входящие» процессы, такие как фильтрация спама и правила клиента, которые перемещают новое сообщение из папки «Входящие» в другую папку, могут выполняться асинхронно. Вы не должны предполагать, что после этих событий вы всегда будете увеличивать количество элементов в папке «Входящие» на один элемент.

Строка EntryIDsCollection содержит идентификатор записи, соответствующий этому элементу. Обратите внимание, что это поведение изменилось с более ранних версий события, когда EntryIDCollection содержал список идентификаторов записей с разделителями-запятыми всех элементов, полученных во Входящие, с момента последнего запуска события.

+0

Понятно, спасибо @eugene, ваша ссылка на MSDN объясняет, что NewMailEx для учетных записей POP3 не IMAP. Так, может быть, лучшим методом было бы создание правила для запуска скрипта при получении электронного письма? Тогда как я могу идентифицировать это письмо? – codeacker

+0

В этом случае экземпляр «MailItem» передается макросу VBA. Нет необходимости использовать метод GetItemFromId для правил. –

+0

Я пробовал это, он снова получает тему без проблем, но не тело. Это означает, что он не может загружать сообщение, пока оно не будет просмотрено или открыто. Теперь я собираюсь попытаться запустить его в этот момент ... больше необходимости в Googling :) – codeacker