我正在尝试使用outlook API删除mailitem。如下所示,
Dim objMail
For each objMail in objFolder.Items
objMail.Delete
Next
显然,立即删除项目很简单。 Outlook只是将其移动到“已删除邮件”文件夹而不是删除它。我试图使用
获取“已删除邮件”文件夹OutlookNameSpace.GetDefaultFolder(olDeletedItems)
并再次删除邮件,但代码正在处理的PST不是默认邮箱,返回的文件夹是错误的已删除邮件文件夹。如何永久删除此mailitem?
我试图遍历当前商店中的所有文件夹,但除了通过比较名称之外,没有办法告诉哪个文件夹是已删除的项目文件夹,我不能这样做,因为程序将以多种语言使用每个版本的名称都不同。
PS:我不能使用第三方dll :(
帮助!
答案 0 :(得分:3)
您的代码的第一个问题不适合您使用的循环。如果要删除(几乎VBA中的任何内容),您需要将集合从最后一个元素循环到第一个元素。如果没有,则在删除第一个元素>>之后更改集合的顺序。第二个移动到第一个位置,不会被删除。
因此,此代码应删除DeltetedItems folder
:
Sub Delete_all_from_dust_bin()
Dim myFolder As Outlook.Folder
Set myFolder = Application.GetNamespace("MAPI"). _
GetDefaultFolder(olFolderDeletedItems)
Dim i As Long
For i = myFolder.items.Count To 1 Step -1
myFolder.items(i).Delete
Next i
End Sub
显然,您可以准备类似的代码以从任何其他文件夹中删除。您将运行两个删除循环以确定删除项目。
来自MSDN的MailItem.Delete Method
的一些其他评论:
由于OP的一些评论,Delete mothod删除集合中的单个项目。删除所有 在文件夹的Items集合中的项目,您必须删除每个项目 从文件夹中的最后一项开始。例如,在项目中 文件夹AllItems的集合,如果有n个项目 该文件夹,开始删除AllItems.Item(n)中的项目,递减 每次删除索引,直到删除AllItems.Item(1)。
编辑。
即使您需要删除某些项目(并非所有项目),请记住使用上面提到的循环类型。
如果您需要引用其他商店中的任何其他DeletedItems folder
,您可以通过以下方式找到此文件夹:
'with index reference
Application.GetNamespace("MAPI").Stores(2).getdefaultfolder(olFolderDeletedItems)
'with name reference
Application.GetNamespace("MAPI").Stores("Business Mail").getdefaultfolder(olFolderDeletedItems)
我不知道这是否适用于所有Outlook版本,但它与Outlook 2010一起使用。
答案 1 :(得分:3)
出于参考目的,这是永久删除我找到的项目的最终方法。
PS:迁移ID是以前存储的GUID,用于跟踪项目的防弹方式
Dim mailIndex
For mailIndex = objFolder.Items.Count To 1 Step - 1
Dim migrationProperty
Set migrationProperty = GetMigrationProperty(objFolder.Items(mailIndex).ItemProperties
if not migrationProperty is nothing Then
objFolder.Items(mailIndex).Delete
Call DeleteMailPermanently(migrationProperty.Value)
End if
Next
Function DeleteMailPermanently(strMailMigrationID)
Dim objDeletedMail, objDeletedMigrationProperty
Set m_objPSTDeletedItemsFolder
= GetDeletedItemsFolder(PSTStore, strMailMigrationID)
For Each objDeletedMail in m_objPSTDeletedItemsFolder.Items
Set objDeletedMigrationProperty
= GetMigrationProperty(objDeletedmail.ItemProperties)
if not objDeletedMigrationProperty is nothing
and objDeletedMigrationProperty.Value = strMailMigrationID then
objDeletedMail.Delete
Next
End Function
Function GetDeletedItemsFolder(objParentFolder, strMigrationID)
Dim objFolder, objMail
For each objMail in objFolder.Items
Dim migrationProperty
Set migrationProperty = GetMigrationProperty(objMail.ItemProperties)
If migrationProperty.Value = strMigrationID
Set GetDeletedItemsFolder = objFolder
Exit Function
End If
Next
if objFolder.Folders.Count >= 1 Then
Dim subFolder
Set subFolder = GetDeletedItemsFolder(objFolder, strMigrationID)
If not subFolder is Nothing Then
Set GetDeletedItemsFolder = subFolder
Exit Function
End If
Set GetDeletedItemsFolder = Nothing
End function
答案 2 :(得分:1)
此外,如果您需要来自默认商店以外的商店的“已删除邮件”文件夹。使用Store.GetDefaultFolder
代替Namespace.GetDefaultFolder
。
如果要完全绕过“已删除邮件”文件夹,则需要使用扩展MAPI(仅限C ++或Delphi - IMAPIFolder::DeleteMessages)或Redemption(任何语言 - RDOMail .Delete方法允许永久删除邮件或将其移动到Deleted Items文件夹。)
答案 3 :(得分:1)
我遇到了同样的问题 - 我的代码想要删除约会项目作为同步的一部分,但这会堵塞Deleted Items文件夹。但我意识到 - 当你删除一个对象时,它所做的只是将它移动到已删除的项目。 所以只需删除它两次!无需担心跟踪属性或清除整个文件夹(可能是过度杀伤)。 击>
似乎有效的方法是删除项目,然后删除已删除项目中的最后一项。
这是我的代码片段:
Set ns = Application.GetNamespace("MAPI")
Set delItemsFolder = ns.GetDefaultFolder(olFolderDeletedItems)
Set calItems = syncFolder.Items
For i = calItems.Count To 1 Step -1
calItems(i).Delete
delItemsFolder.Items.Item(delItemsFolder.Items.Count).Delete
Next