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 のほとんどすべてのものを) 削除する場合は、最後の要素から最初の要素までコレクションをループする必要があります。そうでない場合は、コレクションの順序を変更します。最初の要素を削除した後 >> 2 番目の要素は 1 番目の位置に移動され、削除されません。

したがって、このコードは からすべてのアイテムを削除する必要があります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 MethodMSDN からのいくつかの追加のコメント:

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ます。

削除済みアイテム フォルダーを完全にバイパスする場合は、拡張 MAPI (C++ または Delphi のみ - IMAPIFolder::DeleteMessages ) またはRedemption (任意の言語 - そのRDOMail .Delete メソッドを使用して、メッセージを完全に削除するか移動することができます。削除済みアイテム フォルダーに移動します)。

于 2013-08-07T20:11:03.770 に答える