2

我希望可以问这种问题。目前,尝试自己编写代码完全超出了我的范围。

我需要一个用于 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:我做了一些有时有效的事情,但有时却没有。这非常复杂。我设置了一个规则,即抄送每封发送给我的带有附件的电子邮件。当我收到一封电子邮件时,另一条规则运行以下代码。

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

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

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

这两个想法都非常复杂,任何事情都可能真的出错,我在调试它们时遇到了麻烦。两者都是非最佳解决方案。

4

1 回答 1

0

这是一个可以接受的解决方案吗?抱歉来晚了,但我的 Outlook 副本已损坏。

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

+  Project1 (VbaProject.OTM)

或者

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

如果您没有任何用户表单,则“表单”将丢失。“模块”有可能被扩展。根据需要单击+s 以展开“Microsoft Office Outlook 对象”:

-  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

我已经获取了您的代码,对其进行了一些整理并将其放入事件例程中。当适当的事件发生时,会自动调用事件例程。当用户完成登录时调用此例程。这不是您要求的,但它可能是一个可以接受的折衷方案。

建议二

我之前没有在已发送邮件文件夹上尝试过 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 语句显示您对已发送项目的访问权限有限。如果您尝试访问更敏感的属性,则会向用户触发警告,说明宏正在评估电子邮件。

于 2013-08-13T22:22:39.040 回答