我刚从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组件。希望此更新可以节省其他人的问题!
答案 0 :(得分:0)
这对评论来说太长了,但我对这个问题感到困惑,所以我会用自己的话来重述,以澄清并逐步展示这个过程。
该项目已删除,可能已阅读或未阅读。
- 输出
自动调用
DeletedItems_ItemAdd
程序。
- 您好像有时会遇到此问题,但这不是您的主要问题。
Item.UnRead
。这似乎有效。- 输出
使用
Item.UnRead
属性检查邮件是否未读。如果读取,则返回False
,如果未读取,则返回True
。如果Item.UnRead
为False
,则True
设置为False
。如果已经False
,则它仍为Item.UnRead
。此时,每条消息都应该False
属性等于Item.UnRead
,这实际上表示该项已被读取。
False
。
- 我从您的问题中解释的是,这始终是
False
,这意味着该项目已被阅读。根据第4步,我认为这应该是Item.UnRead
。- 您的说明表明这“可能是也可能不正确”,但我不明白何时不正确。
- 输出
暂停。
False
。
- 您的注释表明其值为
Item.UnRead
,表示该项已被阅读。你认为这是不正确的。我不明白为什么。- 醇>
在正常程序之外执行后续检查。我将假设代码正常工作并检查正确的消息。同样,您注意到
False
为Item.UnRead
,表示已读取消息,然后声明这是不正确的。同样,我不明白为什么这是不正确的。
如果我的分析错误,请更正,以便我可以提供帮助。就是这样,我无法理解这个问题。代码似乎试图通过将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