删除/移动到垃圾箱时将项目标记为已读
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
,如果未读取,则返回True
。Item.UnRead
然后设置为False
,如果它是True
。如果它已经是False
,它仍然是False
。此时,每条消息都应具有等于False
的Item.UnRead
属性,这实际上表明该项目已被读取。我从您的问题中得到的解释是,这始终是
Item.UnRead
是输出。False
,这意味着该项目已被读取。根据第 4 步,我相信这应该是False
。 您的注释表明这“可能正确也可能不正确”,但我不明白它何时不正确。有一个暂停。
您的注释表明它的值为
Item.UnRead
是输出。False
,表明该项目已被读取。你认为这是不正确的。我不明白为什么。在正常程序之外执行后续检查。我将假设代码正常工作并且检查了正确的消息。同样,您注意到
Item.UnRead
是False
,表明该消息已被阅读,然后声明这是不正确的。同样,我不明白为什么这是不正确的。
如果我的分析有误,请更正,以便我提供帮助。照原样,我无法理解这个问题。该代码似乎试图通过将Item.UnRead
属性设置为False
来设置要读取的每条消息。我可以看到的每张支票都返回False
。预期的行为是什么?
【讨论】:
你的分析是正确的;我只是没有很好地解释自己,非常感谢您的耐心和帮助。我说返回不正确的原因是因为在检查 Item.UnRead 时以编程方式返回 FALSE - 项目已读 - UI 将其显示为未读:在垃圾文件夹中查看时加粗,并添加到未读项目计数器中导航窗格。如果我打开该项目或突出显示它并手动标记为已读,则 UI 会更改为将该项目显示为已读。 我写“可能正确也可能不正确”的原因是因为当项目移动到垃圾箱时有十分之几秒的时间,该文件夹的未读项目计数器不会增加,但是那么它不可避免地会发生。我说“可能或可能不会”,因为我不确定这是否意味着它已被移动,标记为已读,因此它没有显示在计数器中,然后恢复为未读状态,或者是否只是轻微延迟的结果计数器更新滞后。以上是关于删除/移动到垃圾箱时将项目标记为已读的主要内容,如果未能解决你的问题,请参考以下文章
PHP:从 POP3 或 IMAP 下载传入的电子邮件,对其进行解析,并在服务器上将其标记为已读/删除