3

我正在尝试使用 Outlook API 删除邮件项。像下面这样,

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

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

OutlookNameSpace.GetDefaultFolder(olDeletedItems)

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

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

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

帮助!

4

4 回答 4

4

您的代码的第一个问题是您使用的循环不合适。如果要删除(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

显然,您可以准备类似的代码以从任何其他文件夹中删除。您将运行两个删除循环以确保删除项目。

MailItem.Delete Method来自 MSDN的一些补充说明:

Delete 方法删除集合中的单个项目。要删除文件夹的 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。

于 2013-08-07T19:37:58.913 回答
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
于 2013-08-07T21:17:43.563 回答
1

此外,如果您需要默认商店以外的商店中的“已删除邮件”文件夹。使用Store.GetDefaultFolder而不是Namespace.GetDefaultFolder.

如果您想完全绕过 Deleted Items 文件夹,您将需要使用 Extended MAPI(仅限 C++ 或 Delphi - IMAPIFolder::DeleteMessages)或Redemption(任何语言 - 它的RDOMail .Delete 方法允许永久删除邮件或移动到“已删除邮件”文件夹)。

于 2013-08-07T20:11:03.770 回答
1

我遇到了同样的问题 - 我的代码想删除约会项目作为同步的一部分,但这堵塞了已删除项目文件夹。但我意识到 - 当你删除一个对象时,它所做的只是将它移动到已删除项目。所以只需删除它两次!无需担心跟踪属性或清除整个文件夹(这可能是矫枉过正)。

编辑:不,对不起,这不起作用。愚蠢的前景。我尝试使用Move方法,然后从 Deleted Items 中删除,但奇怪的是它只是将它放在 Drafts 文件夹中。

似乎可行的是删除一个项目,然后删除已删除项目中的最后一个项目。

这是我的代码片段:

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
于 2014-09-29T08:59:23.747 回答