我是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
答案 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