Outlook 2013:删除/移动到垃圾箱时将项目标记为已读

时间:2016-04-26 19:51:30

标签: vba gmail google-apps outlook-2013

我刚从Outlook 2010升级到2013,我遇到了问题。我使用下面的代码进行设置,以便我删除或移动到垃圾文件夹中的任何内容都会自动标记为已读。

Option Explicit
Dim WithEvents DeletedItems As Outlook.Items

Private Sub Application_Startup()
    Set DeletedItems = Session.GetDefaultFolder(olFolderDeletedItems).Items
End Sub

Private Sub DeletedItems_ItemAdd(ByVal Item As Object)
    If Item.UnRead = True Then
        Item.UnRead = False
        Item.Save
    End If
End Sub

它在2010年已经像魅力一样多年,但在2013年根本不起作用。我没有太多运气找到直接适用的答案,而且我对VBA来说太新了关于如何应用我遇到的一些答案的好照片,所以任何帮助都会受到赞赏。

干杯。

编辑:这是我用来检查Outlook如何查看已删除电子邮件的已读/未读状态的代码。我从here解除了Pause函数。

Private Sub DeletedItems_ItemAdd(ByVal Item As Object)
    RememberItem Item 'Remember which email this is
    Debug.Print "At start: " & Item.UnRead 'Should be True
    If Item.UnRead = True Then
        Item.UnRead = False
        Item.Save
    End If
    Debug.Print "After mark read: " & Item.UnRead 'Should be False
    Pause 10 'In separate module. Code from https://stackoverflow.com/a/30196332/2623367
    Debug.Print "After pause: " & Item.UnRead 'Should be False unless item has become Unread
End Sub

Private Function RememberItem(Optional ByVal Item As Object) As Object
'Allows check-up on the deleted item after event-handler is done with it.
    Static oDeleted As Object
    If Not Item Is Nothing Then Set oDeleted = Item
    Set RememberItem = oDeleted
End Function

Private Sub CheckStatus()
    Dim CheckItem As Object
    Set CheckItem = RememberItem
    Debug.Print "Follow-up check: " & CheckItem.UnRead 'Should be False
End Sub

我得到的输出是:
  - 开始时:True(项目未读 - 这是正确的)
  - 标记读取后:假(读取项目 - 这可能是也可能不正确)
  - 暂停后:假(读取项目 - 这是不正确的)
  - 后续检查:错误(项目被读取 - 这是不正确的)

更新

跟进这个以防万一有人以后遇到它。标记为工作的答案确实解决了我的问题,尽管我偶尔也会看到一些奇怪的行为。稍微深入一点,发现我的问题的根本原因是Outlook和电子邮件服务器之间的同步问题。 Outlook会删除东西,但是同步会变得棘手,看起来Outlook在发送自己的更新之前从服务器中提取更新。这些差异似乎导致Outlook无法跟踪状态删除的电子邮件应该是什么。

我的工作场所使用Google Apps作为他们的电子邮件提供商,我使用正确的IMAP设置在Outlook中设置了所有内容,但Google和Outlook并不好玩。能够通过使用所选答案和Google的Outlook syncing tool for Google Apps消除所有不可预测的行为。同时确认我的原始代码在与Google Apps同步工具结合使用时的行为应该如此。

我应该早点意识到问题可能是谷歌和Outlook基本上是错误的,但它甚至没有发生在我身上,这就是为什么我之前没有提到这个等式的Google组件。希望此更新可以节省其他人的问题!

2 个答案:

答案 0 :(得分:0)

这对评论来说太长了,但我对这个问题感到困惑,所以我会用自己的话来重述,以澄清并逐步展示这个过程。

  
      
  1. 该项目已删除,可能已阅读或未阅读。

  2.   
  3. 自动调用DeletedItems_ItemAdd程序。

         
        
    • 您好像有时会遇到此问题,但这不是您的主要问题。
    •   
  4.   输出
  5. Item.UnRead。这似乎有效。

  6.   
  7. 使用Item.UnRead属性检查邮件是否未读。如果读取,则返回False,如果未读取,则返回True。如果Item.UnReadFalse,则True设置为False。如果已经False,则它仍为Item.UnRead。此时,每条消息都应该False属性等于Item.UnRead,这实际上表示该项已被读取。

  8.   输出
  9. False

         
        
    • 我从您的问题中解释的是,这始终是False,这意味着该项目已被阅读。根据第4步,我认为这应该是Item.UnRead
    •   
    • 您的说明表明这“可能是也可能不正确”,但我不明白何时不正确。
    •   
  10.   
  11. 暂停。

  12.   输出
  13. False

         
        
    • 您的注释表明其值为Item.UnRead,表示该项已被阅读。你认为这是不正确的。我不明白为什么。
    •   
  14.   
  15. 在正常程序之外执行后续检查。我将假设代码正常工作并检查正确的消息。同样,您注意到FalseItem.UnRead,表示已读取消息,然后声明这是不正确的。同样,我不明白为什么这是不正确的。

  16.   

如果我的分析错误,请更正,以便我可以提供帮助。就是这样,我无法理解这个问题。代码似乎试图通过将False属性设置为False来设置要读取的每条消息。我能看到的每张支票都会返回<input data-ng-model="searchFromDate" type="date" class="form-control" data-ng-if="browser.supportsDateInput"> <input data-ng-model="searchFromDate" type="text" class="form-control" data-ng-if="!browser.supportsDateInput" placeholder="yyyy-mm-dd"> 。预期会有什么行为?

答案 1 :(得分:0)

我无法弄清楚你遇到的确切问题,因为我无法复制它,但试试这个:

Option Explicit

Dim WithEvents MainFolder As Outlook.Folder

 Private Sub Application_Startup()
     Set MainFolder = Session.GetDefaultFolder(olFolderInbox)
 End Sub


 Private Sub MainFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean)

     If MoveTo.Name = Session.GetDefaultFolder(olFolderDeletedItems).Name And Item.UnRead = True Then
         Item.UnRead = False
         Item.Save
     End If
 End Sub