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

Posted

技术标签:

【中文标题】删除/移动到垃圾箱时将项目标记为已读【英文标题】:Mark items as read when deleted/moved to trash 【发布时间】:2016-04-26 19:51:30 【问题描述】:

在 Outlook 2010 中,使用下面的代码,我删除或移入垃圾文件夹的任何内容都会自动标记为已读。

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

它在 Outlook 2013 中根本不起作用。

这是我用来检查 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://***.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

我得到的输出:

开始时:真(项目未读 - 这是正确的) 标记读取后:错误(项目已读取 - 这可能正确也可能不正确) 暂停后:错误(已读取项目 - 这是不正确的) 后续检查:错误(项目已读取 - 这是不正确的)

更新:

标记为有效的答案确实解决了我的问题,尽管我偶尔仍会看到一些奇怪的行为。

进一步挖掘发现根本原因是 Outlook 和电子邮件服务器之间的同步问题。 Outlook 会删除一些东西,但同步会很麻烦,看起来 Outlook 在发回自己的更新之前从服务器中提取更新。这些差异似乎导致 Outlook 无法跟踪已删除电子邮件应处于的状态。

我的工作场所使用 Google Apps 作为他们的电子邮件提供商,并且我在 Outlook 中设置了正确的 IMAP 设置,但 Google 和 Outlook 无法正常运行。通过使用选定的答案和 Google 的 Outlook syncing tool for Google Apps,能够消除所有不可预测的行为。

还确认了我的原始代码与 Google Apps 同步工具结合使用时的行为。

我应该早点意识到问题可能是 Google 和 Outlook 一起出现了错误,但我什至没有想到,这就是为什么我之前没有提到这个等式中的 Google 组件。

【问题讨论】:

是否有任何错误信息?将项目放入已删除项目文件夹时会发生什么?代码运行了吗? 我在 Outlook 2013 中测试了这段代码,它对我有用。 您是否记得在打开 Outlook 时打开宏? @OpiesDad:没有错误消息,只是没有任何反应。也许我没有看到或想到的某个地方的某些设置会是一个问题......不过,我在启动 Outlook 时肯定会打开宏。 如果您手动运行 Application_Startup 会发生什么?那它行得通吗?如果在 Deleted_Items_ItemAdd 中设置断点,它会到达断点吗? 【参考方案1】:

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

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

【讨论】:

这似乎奏效了!非常感谢。非常感谢您花时间和精力帮助我。【参考方案2】:

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

    项目被删除,可能已被阅读,也可能未被阅读。

    DeletedItems_ItemAdd 过程被自动调用。

    您有时可能会遇到调用此问题的问题,但这不是您的主要问题。

    Item.UnRead 是输出。这似乎有效。

    使用Item.UnRead 属性检查邮件是否为未读。如果已读取,这将返回 False,如果未读取,则返回 TrueItem.UnRead 然后设置为 False,如果它是 True。如果它已经是False,它仍然是False。此时,每条消息都应具有等于FalseItem.UnRead 属性,这实际上表明该项目已被读取。

    Item.UnRead 是输出。

    我从您的问题中得到的解释是,这始终是False,这意味着该项目已被读取。根据第 4 步,我相信这应该是 False。 您的注释表明这“可能正确也可能不正确”,但我不明白它何时不正确。

    有一个暂停。

    Item.UnRead 是输出。

    您的注释表明它的值为False,表明该项目已被读取。你认为这是不正确的。我不明白为什么。

    在正常程序之外执行后续检查。我将假设代码正常工作并且检查了正确的消息。同样,您注意到Item.UnReadFalse,表明该消息已被阅读,然后声明这是不正确的。同样,我不明白为什么这是不正确的。

如果我的分析有误,请更正,以便我提供帮助。照原样,我无法理解这个问题。该代码似乎试图通过将Item.UnRead 属性设置为False 来设置要读取的每条消息。我可以看到的每张支票都返回False。预期的行为是什么?

【讨论】:

你的分析是正确的;我只是没有很好地解释自己,非常感谢您的耐心和帮助。我说返回不正确的原因是因为在检查 Item.UnRead 时以编程方式返回 FALSE - 项目已读 - UI 将其显示为未读:在垃圾文件夹中查看时加粗,并添加到未读项目计数器中导航窗格。如果我打开该项目或突出显示它并手动标记为已读,则 UI 会更改为将该项目显示为已读。 我写“可能正确也可能不正确”的原因是因为当项目移动到垃圾箱时有十分之几秒的时间,该文件夹的未读项目计数器不会增加,但是那么它不可避免地会发生。我说“可能或可能不会”,因为我不确定这是否意味着它已被移动,标记为已读,因此它没有显示在计数器中,然后恢复为未读状态,或者是否只是轻微延迟的结果计数器更新滞后。

以上是关于删除/移动到垃圾箱时将项目标记为已读的主要内容,如果未能解决你的问题,请参考以下文章

Pubsub:标记为已读

PHP:从 POP3 或 IMAP 下载传入的电子邮件,对其进行解析,并在服务器上将其标记为已读/删除

如何在 Quickblox 中为已读消息集成标记消息功能

使用 Exchange Web Services 2007 将电子邮件标记为已读

在创建通知/警报时,如何知道何时将通知标记为已读

imaplib/gmail 如何在不标记为已读的情况下下载完整消息(所有部分)[重复]