当任何内容到达时,如何让Outlook自动清除文件夹?

时间:2013-08-06 13:00:24

标签: outlook-vba

我希望可以提出这样的问题。现在尝试自己编写代码完全超出了我的范围。

我需要一个Outlook 2007宏,它会在任何内容到达时永久删除已发送邮件文件夹的所有内容。可能吗?如何设置所有内容以便用户不必单击任何内容来运行它?

我知道我要一条鱼,我很尴尬,但我真的需要这个东西......

修改

我已将其粘贴到VBA编辑器中,转换为新模块:

Public Sub EmptySentEmailFolder()

Dim outApp As Outlook.Application
Dim sentFolder As Outlook.MAPIFolder
Dim item As Object
Dim entryID As String

Set outApp = CreateObject("outlook.application")
Set sentFolder = outApp.GetNamespace("MAPI").GetDefaultFolder(olFolderSentMail)

For i = sentFolder.Items.Count To 1 Step -1
    sentFolder.Items(i).Delete             '' Delete from mail folder
Next
Set item = Nothing
Set sentFolder = Nothing
Set outApp = Nothing
End Sub

这只是我在网站上某处删除已删除邮件的一段代码的略微修改版本。它在我运行它时会删除已发送邮件文件夹。你能否帮我修改它,以便在文件夹中出现任何内容时删除已发送的项目,并且用户不必点击任何内容来运行它?我需要它是一个完全自动化的过程。

编辑2 如果您认为有比VBA更好的工具来实现这一点,请不要犹豫,编辑标签和评论。

编辑3:我做了一些有时可行的工作,但有时却没有。这太荒谬了。我设置了一条规则,ccs每个发送的电子邮件都带有附件给我。当我收到一封电子邮件时,另一条规则会运行以下代码。

Sub Del(item As Outlook.MailItem)
Call EmptySentEmailFolder
End Sub

这件事有三种行为,我无法确定触发哪种行为。有时事情会清除已发送邮件文件夹。有时它什么都不做。有时第二条规则会给出“操作失败”错误消息。

每当有什么东西来自我的地址时采取行动的想法都不是最优的,原因是我为了简洁起见省略了。我试图用报告替换它。我制定了一条规则,每当我发送电子邮件时都会发送一份传递报告。然后另一个规则在收到报告时运行代码。但是,这只有一种行为:它从不做任何事情。

这两个想法都是如此复杂,以至于任何事情都可能出错,我在调试时遇到了麻烦。两者都是非最佳解决方案。

1 个答案:

答案 0 :(得分:0)

这是否可以接受?对不起,但是我的Outlook副本坏了。

当您进入Outlook VB编辑器时,Project Explorer将位于左侧。如果不是,请单击 Ctrl + R 。它看起来像这样:

+  Project1 (VbaProject.OTM)

-  Project1 (VbaProject.OTM)
   +  Microsoft Office Outlook Objects
   +  Forms
   +  Modules
如果您没有任何用户表单,

“表单”将会丢失。可以扩展“模块”。根据需要单击 + 以展开“Microsoft Office Outlook Objects”:

-  Project1 (VbaProject.OTM)
   -  Microsoft Office Outlook Objects
        ThisOutlookSession
   +  Forms
   +  Modules

单击 ThisOutlookSession 。除非您已使用此代码区,否则模块区域将变为白色。此区域类似于模块,但具有其他权限。将此代码复制到该区域:

Private Sub Application_MAPILogonComplete()

  ' This event routine is called automatically when a user has completed log in.

  Dim sentFolder As Outlook.MAPIFolder
  Dim entryID As String
  Dim i As Long

  Set sentFolder = CreateObject("Outlook.Application"). _
                        GetNamespace("MAPI").GetDefaultFolder(olFolderSentMail)

  For i = sentFolder.Items.Count To 1 Step -1
    sentFolder.Items(i).Delete             ' Move to Deleted Items
  Next

  Set sentFolder = Nothing

End Sub

我已经拿走了你的代码,整理了一下,然后把它放在一个事件例程中。发生适当的事件时会自动调用事件例程。用户完成登录后会调用此例程。这不是您所要求的,但可能是可接受的折衷方案。

建议2

我之前没有在“已发送邮件”文件夹上尝试过ItemAdd事件例程,尽管我已将其与收件箱一起使用。根据我的有限测试,删除发送的项目不会干扰发送。

此代码属于“ThisOutlookSession”。

Option Explicit
Public WithEvents MyNewItems As Outlook.Items
Private Sub Application_MAPILogonComplete()

  Dim NS As NameSpace

  Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")

  With NS
    Set MyNewItems = NS.GetDefaultFolder(olFolderSentMail).Items
  End With

End Sub
Private Sub myNewItems_ItemAdd(ByVal Item As Object)

  Debug.Print "--------------------"
  Debug.Print "Item added to Sent folder"
  Debug.Print "Subject: " & Item.Subject
  Item.Delete             ' Move to Deleted Items
  Debug.Print "Moved to Deleted Items"

End Sub

Debug.Print语句显示您对发送项目的访问权限有限。如果您尝试访问更多敏感属性,则会向用户发出警告,指出宏正在评估电子邮件。