在outlook中永久删除mailitem

时间:2013-08-07 18:47:35

标签: outlook outlook-2007 outlook-2010 outlook-vba outlook-2003

我正在尝试使用outlook API删除mailitem。如下所示,

Dim objMail
For each objMail in objFolder.Items
objMail.Delete
Next

显然,立即删除项目很简单。 Outlook只是将其移动到“已删除邮件”文件夹而不是删除它。我试图使用

获取“已删除邮件”文件夹
OutlookNameSpace.GetDefaultFolder(olDeletedItems)

并再次删除邮件,但代码正在处理的PST不是默认邮箱,返回的文件夹是错误的已删除邮件文件夹。如何永久删除此mailitem?

我试图遍历当前商店中的所有文件夹,但除了通过比较名称之外,没有办法告诉哪个文件夹是已删除的项目文件夹,我不能这样做,因为程序将以多种语言使用每个版本的名称都不同。

PS:我不能使用第三方dll :(

帮助!

4 个答案:

答案 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的一些其他评论:

  

Delete mothod删除集合中的单个项目。删除所有   在文件夹的Items集合中的项目,您必须删除每个项目   从文件夹中的最后一项开始。例如,在项目中   文件夹AllItems的集合,如果有n个项目   该文件夹,开始删除AllItems.Item(n)中的项目,递减   每次删除索引,直到删除AllItems.Item(1)。

由于OP的一些评论,

编辑

即使您需要删除某些项目(并非所有项目),请记住使用上面提到的循环类型。 如果您需要引用其他商店中的任何其他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