【问题标题】:VBA Outlook 2010 received mail .Body is emptyVBA Outlook 2010 收到邮件。正文为空
【发布时间】:2017-07-09 23:10:50
【问题描述】:

我正在 Outlook VBA 中编写一个脚本来记录 Access 数据库中的每封电子邮件,因为它们进入我的收件箱。我触发的代码没有问题。它可以毫无问题地访问 Access 数据库。它可以毫无问题地复制主题。然后它到达身体并且根本不复制任何内容。我尝试过 .HTMLbody 之类的东西,而不仅仅是 .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

如果有人知道我做错了什么,请告诉我。三个小时的谷歌搜索似乎没有排序!

【问题讨论】:

  • 您的消息框也没有返回任何内容吗?
  • 是的@Jordan 消息框打开(所以没有抛出错误)但里面什么都没有。
  • 单步执行您的代码 (F8) 并在分配后在您的 Locals 窗口中查看 objEmail。展开变量时,看看是否有 body 属性。想知道GetItemFromID 是否真的返回了MailItem
  • 刚刚试过@click,有一个body 属性设置为一个空字符串。我可以看到主题字符串和其他一切都很好,但没有body。之前也忘了提,这是在 IMAP 帐户上,这有什么不同吗?
  • 之前问过同样的问题stackoverflow.com/questions/23601992/… 那里的评论暗示如果请求应该加载的正文可能尚未加载。

标签: vba ms-access outlook


【解决方案1】:

感谢 LEBoyd,这个问题现已得到解决!解决方案是 .display 消息,然后立即 .close olDiscard。由于一些尚未解释的原因,它充满了身体。在这里查看 LEBoyd 的问题 - Outlook 2010 Email body is empty

【讨论】:

    【解决方案2】:

    尝试从NewMailEx 事件处理程序中删除任何额外的代码(访问)。请谨慎使用此方法,以尽量减少对 Outlook 性能的影响。但是,根据客户端计算机上的设置,新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。您不应假设在这些事件触发后,收件箱中的项目数量总是会增加一项。

    EntryIDsCollection 字符串包含对应于该项目的条目 ID。请注意,当EntryIDCollection 包含自上次触发事件以来收件箱中收到的所有项目的逗号分隔条目 ID 列表时,此行为与早期版本的事件有所不同。

    【讨论】:

    • 这很有启发性,感谢@eugene 您的 MSDN 链接说明 NewMailEx 用于 POP3 帐户而不是 IMAP。所以也许最好的方法是创建一个规则来在收到电子邮件时运行脚本?那我怎么识别那封邮件呢?
    • 在这种情况下,MailItem 的一个实例被传递给 VBA 宏。规则不需要使用GetItemFromId方法。
    • 我试过了,它再次获得主题没有问题,但不是正文。这意味着在预览或打开消息之前,它无法下载消息。现在我将尝试在那个时候触发它......需要更多谷歌搜索:)
    • @codeacker,我知道这已经过时了,但你有没有找到解决问题的方法?我在 2010 Outlook 上遇到了类似的问题。主题在那里,HTMLBody 显示一些 HTML 文本,但不显示消息中的文本,并且 .Body 为空。我尝试循环通过睡眠过程,因为我发现一篇关于加载 .Body 可能延迟的帖子,但即使在 20 秒循环后我仍然没有 .Body。
    • 感谢@codeacker。我确实发现,如果我 .display 消息然后立即 .close oldiscard,无论出于何种原因,它都会填满正文。这是我提出的新问题:stackoverflow.com/questions/51639665/…
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2020-08-15
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多