VBA创建和发送Outlook电子邮件,并通过草稿/发送/发送过程跟踪它。?

时间:2017-11-08 21:29:43

标签: vba email outlook outlook-vba

我是Outlook VBA的新手。我希望通过“草稿”,“发件箱”和“已发送”来跟踪电子邮件通过其生命周期的阶段和文件夹的状态。相关的兴趣是能够查找和访问现有电子邮件以收集属性信息,例如发送时间。我已经开始使用包含的代码块,但它不能正常工作。

正如我很快发现的那样,Do Loop在发送电子邮件时失败,因为该变量与电子邮件断开连接。这会导致运行时错误“项目已被移动或删除”。还有一个奇怪的细节:错误编号(Err.Number)每次都不同,我想知道设计目的是什么。

如何在通过草稿,发件箱和已发送邮件时发送电子邮件保持联系?我看到许多提到变量与mailitem断开连接,但没有解决方案依赖于对象层次结构并避免后期绑定来解决问题。我想也许会有一个标识消息的GUID或UUID,但是如文档中所示,如果项目被移动,则所有属性(如EntryID)都可以更改,并且不应依赖此类属性。

我想通过更深入的检查,这是有道理的,因为电子邮件只是数据库表中的记录。如果您在表之间复制/删除记录,则信息可能相同或相似,但记录号可能不会。此外,它会打到其他指甲:同一封电子邮件可以多次发送,也可以复制/粘贴到不同的文件夹,甚至不同的帐户。现在有什么独特与否......?就像科幻克隆人说的那样,谁是真实的,谁是副本......?

因此,除了保持与电子邮件的“连接”之外,可以使用哪些属性或技术来识别ID?如果没有“正确”的方式来识别所述的邮件项目,那么我唯一能想到的就是使用现有的或自定义的字段,比如OCX控件的“Tag”属性,来插入UUID。一些公司通过在主题行中放置一个电话/订单/支持号码来使用这种技术,以便更容易跟踪。

Dim outlobj As Outlook.Application
Dim mailobj As Outlook.MailItem
Set outlobj = Outlook.Application
Set mailobj = outlobj.CreateItem(olMailItem)
With mailobj
    .Recipients.Add "wonderwoman@hallofjustice.com"
    .Subject = "Invisible Jet Scheduled Maintenance Reminder"
    .Body = "Your invisible jet need to be polished."
    .Attachments.Add zipFilename
    .Display
    .Send
End With

Do
    'next line fails due to email moving through Drafts, Outbox, & Sent
    'notably, the VBA runtime Err.Num is different each time
    'how do i keep the variable connected to a moving target?
    If mailobj.Sent = False Then
        Sleep 100
    Else
        MsgBox "The email has been sent."
        'other code
        Exit Do
    End If
Loop

1 个答案:

答案 0 :(得分:2)

创建一个类并将MailItem添加为该类的事件启用属性。处理诸如打开/写入/发送/保存等事件以对电子邮件生命周期进行自定义控制。 EntryID是每个邮件项的唯一属性。

请注意,条目ID仅在首次保存项目后生成,并在用户手动在文件夹之间移动项目时隐式更改。

以下是一个让你入门的例子:

像这样添加一个类Class1

Option Explicit

Public WithEvents mItem As MailItem
Public id               As String

Private Sub mItem_Open(Cancel As Boolean)
    MsgBox "Mail item will be displayed."
    id = mItem.EntryID
End Sub

添加一个包含以下代码的模块:

Option Explicit

Sub test()

    Dim cls As New Class1
    Dim id  As String

    Dim outlobj As Outlook.Application
    Dim mailobj As Outlook.MailItem
    Set outlobj = Outlook.Application
    Set mailobj = outlobj.CreateItem(olMailItem)

    Set cls.mItem = mailobj

    With mailobj
    .Recipients.Add "xx@yy.zz"
    .Subject = "Test"
    .Body = "Test Content of the e-mail."
    .Save
    .Display
    id = cls.id '/ Store ID for later use.
    Debug.Print id
    End With


  '/ Search that e-mail and display its body contents
  Call Retrieve(id)


End Sub


Sub Retrieve(sEntryId As String)
    Dim mailobj As Outlook.MailItem
    Dim ns As NameSpace

    Set ns = GetNamespace("MAPI")
    Set mailobj = ns.GetItemFromID(sEntryId)
    MsgBox mailobj.Body

End Sub

运行子test