Outlook VBA永久删除共享邮箱中的旧电子邮件

问题描述:

我有一个问题,我需要从共享邮箱中删除超过特定年龄的邮件。Outlook VBA永久删除共享邮箱中的旧电子邮件

不幸的是,自动存档功能不会影响共享邮箱,并且每次我尝试运行规则来执行此操作时,都会失败并且不会执行任何操作。我一直不得不手动清除这个邮箱里的数百封电子邮件,这个邮箱需要绝对的年龄(当你有30多万个坐在那里的时候......),因为它填补了我自己删除的项目。

我非常精通Excel VBA,但我不知道Outlook如何处理事情。我一直在寻找一种方法来做到这一点,但我还没有找到任何可靠的,我可以使用,这是很好的注释教我。

有没有其他人曾经做过同样的事情?我不能是唯一一个想要这样做的人吗?

编辑: 我一直在斩断我发现尝试实现这一点的随机代码。我有权访问我的部门中的其他6个共享邮箱。我一直在看GetSharedDefaultFolder函数,但它不是很好解释,并且通常在我的懒散尝试运行时出现错误。我不确定收件人功能需要什么,因为我尝试过邮箱名称和地址。该MS网络资源不是非常有帮助在这种情况下:

编辑2:

我已经编辑我的代码下面。在这个版本中,我得到一个溢出错误的线对于intCount = olSharedBox.Items.Count到1步-1 -1 由于该箱中有超过30万电子邮件,我认为它现在正在寻找正确的东西,但不知道的方式周围。是否无法从收件箱旁边显示的预先计数的数字中获取当前编号?

Sub DeleteOldSharedMail() 

Dim olApp As Outlook.Application 
Dim olNS As Outlook.NameSpace 
Dim olMailItem As Outlook.MailItem 
Dim objVariant As Variant 
Dim lngMovedItems As Long 
Dim intCount As Integer 
Dim intDateDiff As Integer 
Dim olSharedBox As Folder 
Dim mbOwner As Outlook.Recipient 


Set olApp = Outlook.Application 
Set olNS = olApp.GetNamespace("MAPI") 
Set mbOwner = olNS.CreateRecipient("[email protected]") 
Set olSharedBox = olNS.GetSharedDefaultFolder(mbOwner, olFolderInbox) 

For intCount = olSharedBox.Items.Count To 1 Step -1 
    Set objVariant = olSharedBox.Items.Item(intCount) 
    DoEvents 
    If objVariant.Class = olMail Then 

     intDateDiff = DateDiff("d", objVariant.SentOn, Now) 

     ' Set number of days 
     If intDateDiff > 180 Then 
      objVariant.Delete 
      Call ClearDeletedFolder ' Working. Will change to call every 100 emails deleted after first run. 

      'count the # of items moved 
      lngMovedItems = lngMovedItems + 1 

     ' No need to run the IF statement on the rest of the mailbox assuming the macro runs from oldest to newest. 
     'Else: GoTo Marker 

     End If 
    End If 
Next 

' Display the number of items that were moved. 
Marker: 
MsgBox "Moved " & lngMovedItems & " messages(s)." 
End Sub 
+0

是否运行了办公室?有没有试过你可以分享的东西? – 0m3r

+0

我正在使用Office 2013,并编辑了我的问题以包含第一次尝试,从其他资源中收集我可以获得的内容。我想念优秀的VBA。相比之下,展望似乎很奇怪。 – JaayB

+0

Dim intCount As Long – niton

您可以使用NameSpace.GetSharedDefaultFolder方法在收件箱中删除项目。但是,如果这些项目位于另一个文件夹中,您需要使用该邮箱的完整邮箱访问权限或对特定文件夹写入权限。在这些情况下,如果该邮箱已被添加到当前的Outlook配置文件中,您将需要找到该邮箱中的文件夹。然后,您可以从NameSpace.Store中匹配的Store对象中访问文件夹(例如,通过Store.GetDefaultFolder或.GetRootFolder,然后“通过Folder.Folders集合”步行)。

无论如何,在Outlook对象模型中立即永久删除电子邮件。但是,如果在“已删除邮件”文件夹中再次找到它,则可以将其删除两次。

参见: How to: Delete All Items and Subfolders in the Deleted Items Folder

+0

删除代码运行平稳,并且在从邮箱中删除的每封电子邮件之后,我都会打电话来触发它。我知道它效率低下,但第一次运行它可能会删除大约100k电子邮件,并且它们不适合我删除的项目。^ _^ 我编辑了我的答案以包含我的第一次尝试。由于在线文档不是非常友好,而且其他代码示例在其用法上各不相同,所以我很难理解您所述的方法。 – JaayB

+0

您似乎正确使用GetSharedDefaultFolder;您确定您拥有该用户收件箱中的编辑/删除权吗?顺便说一句,将intCount更改为Long,因为VBA中的整数具有最大值32767 –

+0

找到几个示例后,我花了一段时间才了解它。由于某种原因,MSDN网站也需要永久和一天的时间来加载我的工作网络。但似乎你和niton对于整合者是正确的!只要我将它改为“长”,我就可以顺利完成整个事情。非常感谢。 – JaayB