excel 计算原始电子邮件

tvokkenx  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(186)

我需要从Excel在特定时间范围内计算Outlook中的电子邮件。我暂时把时间表硬编码了。这部分似乎起作用了,至少计数是正确的。
我需要新邮件的数量。它计算每一封电子邮件,而不仅仅是原件。
我看了看.GetConversation,然后读到conversationID随着每封电子邮件的变化而变化,所以原件有44个字符。我认为这将是一个很好的方式来过滤,但我不明白什么是在该属性,因为它不工作。
它一直工作,直到它尝试按会话ID进行筛选。

Sub cntEmail()
'I WILL NEVER COUNT EMAILS AGAIN, dangit
    Dim ns As Namespace: Set ns = GetNamespace(Type:="MAPI")
    Dim fldr As Folder, fldrDone As Outlook.Folder
    Dim inboxItems As Items, doneItems As Items, sFilter As String
    
    Set fldr = ns.Folders("Call Center").Folders("Inbox")
    Set fldrDone = ns.Folders("Call Center").Folders("DONE")
    Set inboxItems = fldr.Items
    Set doneItems = fldrDone.Items
    sFilter = "[LastModificationTime] > '" & Format("1/13/2023 17:00", "ddddd h:mm AMPM") & "' AND [LastModificationTime] < '" & Format("1/20/2023 16:59", "ddddd h:mm AMPM") & "'"
    Set inboxItems = inboxItems.Restrict(sFilter)
    Set doneItems = doneItems.Restrict(sFilter)
    
    Debug.Print "Total Inbox Count: " & inboxItems.Count
    Debug.Print "Total Done Count: " & doneItems.Count
    
    'Everything above this comment works

    Set inboxItems = inboxItems.Restrict("[ConversationID] < 45")
    Set doneItems = doneItems.Restrict("[ConversationID] < 45")
    
    Debug.Print "Total Inbox Count: " & inboxItems.Count
    Debug.Print "Total Done Count: " & doneItems.Count

    Set fldr = Nothing
    Set fldrDone = Nothing
    Set ns = Nothing
End Sub
06odsfpq

06odsfpq1#

会话ID

据我所知,ConversationID是一个属性,对于属于同一个会话的所有mailItem都具有相同的值(更多的是here)。
这意味着,如果您回复了一封电子邮件,并且对方回复了您的回复,则您从他们那里收到的第二封电子邮件应该具有相同的ConversationID
我假设,当你说你想计算“原始电子邮件”,你的意思是你想避免计算第二封电子邮件,因为它是由第一封(原始)电子邮件发起的对话的一部分。
因此,基本上,您需要计算mailItem中有多少个唯一的ConversationID值。
我没有使用过.Restrict,所以我不确定是否可以将其用于此目的,但有一些方法可以通过在MailItems上循环并计算唯一值来获得ConversationID的唯一值总数。

选项一:使用集合

一种方法是使用集合。因为一个集合不能包含两个键相同的元素,所以我们可以用它来计算唯一值的数量。
例如:

Dim UniqueConversations As New Collection
    
    Dim inboxItem As MailItem
    For Each inboxItem In inboxItems
        On Error Resume Next
            'This line will return an error when the key already matches an item in the collection
            'and the item won't be added to the collection.
            UniqueConversations.Add 1, inboxItem.ConversationID
        On Error GoTo 0
    Next inboxItem

    Debug.Print "Total Inbox Count: " & UniqueConversations.Count

选项二:使用字典

字典解决方案更优雅一点,因为我们不需要使用On error语句。
当我们使用字典时,我们不会得到错误的原因是,当键已经存在于字典中时,我们只会覆盖存储的值。
例如:

'Make sure to include Microsoft Scripting Runtime Library or use the drop-in replacement VBA-tools/VBA-Dictionary on Mac
    Dim dict As Dictionary
    Set dict = New Dictionary
    
    Dim inboxItem As MailItem
    For Each inboxItem In inboxItems
        dict.Item(inboxItem.ConversationID) = 1
    Next inboxItem
    
    Debug.Print "Total Inbox Count: " & dict.Count

如果你有很多电子邮件,字典方法通常更快,但我没有注意到我做的小测试有很大的区别。

fdbelqdn

fdbelqdn2#

您不能创建像[ConversationID] < 45这样的属性长度限制(在Extended MAPI中可以,但只能在C++或 Delphi 中使用)。尝试创建PR_SUBJECT_PREFIX MAPI属性为空字符串的限制。在回复上是"RE",在转发上是"FW"

@SQL="http://schemas.microsoft.com/mapi/proptag/0x003D001F" = ''

在代码中:

Set inboxItems = inboxItems.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x003D001F"" = ''")
Set doneItems = doneItems.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x003D001F"" = ''")

相关问题