【问题标题】:How to find all unaswered emails sent from client?如何查找客户发送的所有未答复的电子邮件?
【发布时间】:2020-05-09 19:53:15
【问题描述】:

我需要跟进从我发送给其他用户但其他用户从未回复的所有电子邮件。它可以是新的电子邮件,也可以是正在进行的对话中未回复的电子邮件。

如何在对话或新邮件中获取发送的最后一封电子邮件?

我正在运行 Microsoft Office 356 ProPlus 版本 1908(内部版本 11929.20606)

我的 VBA 脚本在我的收件箱 ('\firstname.lastname@domain.com\Inbox') 中找到电子邮件并将它们移动到“未答复”子文件夹。

问题是电子邮件主要来自其他用户,当我过滤来自我的电子邮件时(通过使用文件夹中的默认过滤器,例如来自:“发件人”),我得到的只是发送给自己的邮件或自动生成的邮件代表我从 SharePoint 服务器(例如与其他用户共享的 SharePoint 网站)。

我尝试仅搜索我的已发送文件夹 ('\firstname.lastname@domain.com\Sent'),这列出了与我使用默认文件夹过滤器过滤从我发送的邮件时相同的项目,这些项目是在查询我的收件箱。

为了决定将哪些邮件放入我的“未答复”文件夹,我尝试了以下方法:

1) “DASL 搜索”通过排除所有最后执行的动词设置为“replied to all”或“replied to”的邮件。

NOT ("http://schemas.microsoft.com/mapi/proptag/0x10810003" = 102 OR "http://schemas.microsoft.com/mapi/proptag/0x10810003" = 103)

2) 使用 ConversationIndex,我在网上发现未答复的邮件的 ConversationIndex 长度 = 44:

If Len(objVariant.ConversationIndex) = 44 Then

3) 使用 LastExecutedVerb。通过检查对话中电子邮件的属性注意到,我作为最新项目发送的电子邮件在使用时始终具有“PR_LAST_VERB_EXECUTED 0”:

Debug.Print "PR_LAST_VERB_EXECUTED", propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x10810003")

SoIi 尝试过滤 PR_LAST_VERB_EXECUTED = 0 的电子邮件,但这导致根本找不到电子邮件。

【问题讨论】:

  • 这些电子邮件在哪里?我希望来自您的电子邮件位于“已发送邮件”文件夹中。我希望您的电子邮件在文件夹收件箱中。您正在尝试将一些电子邮件移动到未答复的文件夹中。这表明要了解转换的状态,您需要查看三个文件夹。我是否正确理解了这个问题?
  • 嗨托尼!感谢您的问题,根据它澄清了我最初的问题描述!这些项目位于我的收件箱中,我的假设是查询会自动在所有文件夹中查找项目,包括已发送文件夹?我尝试查询已发送文件夹,但这仅返回发送给我自己或从共享点自动生成的邮件,而不是我在对话中的最后一封电子邮件。
  • 你能发布你的代码吗?

标签: vba outlook


【解决方案1】:

PR_LAST_VERB_EXECUTED 必须检查属性是否缺失(= null)

@SQL="http://schemas.microsoft.com/mapi/proptag/0x10810003" is null

【讨论】:

  • 嗨,德米特里!我正在使用 Outlook.Application.AdvancedSearch,它不需要/接受“@SQL”前缀。但是我将我的 if 子句更改为使用“is null”而不是“=0”,它设法找到项目,但结果和以前一样,仍然没有显示在正在进行的对话中从我发送的最新电子邮件。
  • "最新的'?查询将返回多个项目,您有责任选择正确的项目。
  • 对不起,是的,查询返回多个项目。但是当我在文件夹中搜索我自己的电子邮件时,我只会得到发送给我自己的邮件或代表我从 SharePoint 自动生成的邮件,而不是我在对话中发送的最新邮件。
  • 对于查询返回的消息,如果设置了 PR_LAST_VERB_EXECUTED,您是否使用 OutlookSpy 或 MFCMAPI 检查,如果设置了,该属性的值是什么?
  • 您好,使用Debug.Print读取了同一个会话中3封邮件的参数。 Conversation_Index_Length = 44(从我发送)和 64(回复所有)由于某种原因仅返回索引 54:Conversation_Index_Length: 44 PR_LAST_VERB_EXECUTED 0 PR_LAST_VERB_EXECUTION_TIME Null PR_SUBJECT_PREFIX_PT_STRING8 Conversation_Index_Length: 54 PR_LAST_VERB_EXECUTED 0 PR_LAST_VERB_EXECUTION_TIME Null PR_SUBJECT_PREFIX_PT_STRING8 RE: Conversation_Index_Length: 64 PR_LAST_VERB_EXECUTED 103 PR_LAST_VERB_EXECUTION_TIME 2020-03-24 13:22:00 PR_SUBJECT_PREFIX_PT_STRING8 RE:
【解决方案2】:

我没有任何合适的对话,也没有使用 SharePoint,因此无法调查您的问题。这不是答案,而是解释我将如何调查您的要求并开发解决方案。

Outlook VBA 有一些强大的过滤器,但我很少能够根据我的要求调整它们。当我有像你这样的要求时,还没有一组电子邮件可供选择。相反,我浏览我的电子邮件,丢弃那些具有特征 A 或没有特征 B 的邮件,然后处理剩下的邮件。所以,我的代码是这样的:

Dim Review As Boolean

For Inx = FldrSrc.Items.Count To 1 Step -1

  ItemCrnt = FldrSrc.Items(Inx)
  Review = True

  If ItemCrnt has CharacteristicA Then
    Review = False
  End If
  If Review Then
    If ItemCrnt does not have CharacteristicB Then
      Review = False
    End If
  End If
  If Review Then
    If ItemCrnt has CharacteristicC Then
      Review = False
    End If
  End If

  If Review Then
    ItemCrnt.Move FldrDest
  End If

Next

在上面的代码中,我访问了FldrSrc.Items。如果您愿意,您可以访问过滤后的项目集合。

你会注意到我的For-Loop 倒计时了。这个很重要。 FldrSrc.Items 是一个集合,其中每个项目都由其位置标识。考虑:

┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ Item 1 │ Item  2│ Item 3 │ Item 4 │ Item 5 │ Item 6 │ Item 7 │ Item 8 │ Item 9 │
└────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘

假设我删除第 5 项。第 6 项变为第 5 项,第 7 项变为第 6 项,依此类推:

┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ Item 1 │ Item  2│ Item 3 │ Item 4 │ Item 5 │ Item 6 │Item  7 │Item  8 │
│        │        │        │        │  was 6 │  was 7 │  was 8 │  was 9 │
└────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘

如果我向前计数,在删除第 5 项后,我检查第 6 项。但第 6 项是旧的第 7 项;我从不检查旧的第 6 项。

但是如果我倒数,在删除第 5 项后,我检查没有移动的第 4 项。

我希望这个解释是清楚的。如果没有,请接受如果您可能从中删除项目,您总是向后扫描集合。

然后您需要考虑循环的主体。对于每种类型的电子邮件,您需要确定该类型的电子邮件必须具有或不具有的一些特征或特征。我相信我的诊断程序将有助于完成这项任务。访问https://stackoverflow.com/a/58000707/973283 并将代码复制到模块中。在顶部附近您会发现:#Const Selected = True。这必须替换为#Const Selected = False。您还需要引用以下库:“Microsoft Scripting Runtime”和“Microsoft ActiveX Data Objects n.n Library”。

完成后,选择一封或多封您想要复制到未答复文件夹的电子邮件。然后运行宏InvestigateEmails()。该宏将在您的桌面上创建一个名为“InvestigateEmails.txt”的文件。该文件将列出我认为有用的所选电子邮件的每个属性的值。查看不需要的电子邮件并确定使它们与众不同的属性。

这些说明可能看起来有点奇怪。运行我的宏并检查输出。我相信很快就会清楚你需要做什么。

【讨论】:

  • 嗨,托尼,在 InvestigateEmails() 的帮助下,我了解到 Outlook 在通过移动设备回复或编辑收件人列表时会显示 PR_LAST_VERB_EXECUTED 无效,这使得在这些情况下很难查看是否回复了电子邮件。然而,对话索引长度会增加,因此这可能会用于进一步改进我的脚本,但这对我来说太先进了。 :)
  • @AmirHodzic 回复是否包含原始电子邮件的副本?如果是这样,该副本可能会以“2020 年 1 月 9 日星期四 12:40,<a.j.dallimore(xxxxxx.com> 写道:”之类的内容开头。搜索这样的标题行或原始正文中的关键短语可能会找到回复。
  • 对不起,我上一条评论中的字符实体没有正确显示。 <a.j.dallimore(xxxxxx.com>应该读作
  • 我很高兴InvestigateEmails 透露了一些有用的信息。我还能再帮忙吗?
猜你喜欢
  • 2010-11-09
  • 2016-08-18
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2013-04-03
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多