如何返回最近收到的电子邮件?

Posted

技术标签:

【中文标题】如何返回最近收到的电子邮件?【英文标题】:How to return most recently received email? 【发布时间】:2021-06-08 17:09:16 【问题描述】:

我正在尝试在收件箱中搜索包含名为“TAX”的附件的最新电子邮件,并将该附件保存到文件夹中。

这是一个很大的收件箱,所以我限制了按主题行搜索,然后按 ReceivedTime 对选择进行排序。

代码并不总能找到最新的电子邮件。例如,即使有昨天的电子邮件,它也会抓取三天前或一个月前的附件。

Set olApp = New Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set sharedemail = olNS.CreateRecipient("Company@Email.com")
Set olfldr = olNS.GetSharedDefaultFolder(sharedemail, olFolderInbox)
Set folder = olfldr

Set myTasks = folder.Items.Restrict("[Subject]='Payables'")

myTasks.Sort "[ReceivedTime]", True

'Search folder for 'TAX' or 'tax' attachments, save into prior day folder

For Each olMail In myTasks
    If olMail.Attachments.Count > 0 Then
        For Each objAtt In olMail.Attachments
            If InStr(objAtt.Filename, "TAX") Or InStr(objAtt.Filename, "tax") Then
                objAtt.SaveAsFile priorSaveFolder & "TAX.html"
                
                foundFlag = True
             
                Exit For
            End If
        Next objAtt
    End If
    
    If foundFlag = True Then Exit For
Next olMail

我没有按主题行限制,而是尝试限制在某个时间范围内(例如过去 7 天)。

daysAgo = 7
Set myTasks = folder.Items.Restrict("[ReceivedTime]>'" & Format(Date - daysAgo, "DDDDD HH:NN") & "'")

myTasks.Sort "[ReceivedTime]", True

For Each olMail In myTasks
    If olMail.Attachments.Count > 0 Then

在线If olMail.Attachments.Count > 0 Then(其余代码相同)。

我收到一个错误

类不支持自动化或不支持预期的接口。

如果我删除myTasks.Sort "[ReceivedTime]", True 行,代码会返回一封在给定时间范围内不是最新的电子邮件。

如何对电子邮件进行排序以从集中提取具有特定附件名称的最新邮件?

【问题讨论】:

尝试以相反的顺序排序。 【参考方案1】:

首先,我注意到您帖子中的以下代码行:

Set myTasks = folder.Items.Restrict("[Subject]='Payables'")

myTasks.Sort "[ReceivedTime]", True

'Search folder for 'TAX' or 'tax' attachments, save into prior day folder

For Each olMail In myTasks
    If olMail.Attachments.Count > 0 Then

遍历具有指定主题的所有项目并不是一个好主意。我建议检查搜索条件是否项目也有附件。因此,您可以简单地遍历带有附件的项目,从代码中删除额外条件,例如,以下条件检查主题行和附件:

Filter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & _
                   Chr(34) & " Like '%training%' AND " & _
                   Chr(34) & "urn:schemas:httpmail:hasattachment" & _
                   Chr(34) & "=1"

注意主题行除了搜索字符串中指定的符号外,还可能包含其他符号,所以所有项目都会被选中。

最后,请记住,Outlook 中的文件夹可能包含不同类型的项目 - 约会、邮件、文档、便笺等。为防止使用不存在的属性和方法,我建议先检查邮件类。

【讨论】:

【参考方案2】:

该错误意味着您正在处理 MailItem 以外的对象 - 您还可以在收件箱文件夹中拥有 MeetingItemReportItem 对象。尝试将olMail 声明为通用Object 并检查olMail.Class = 43

至于排序,您是说正确的项目甚至不在受限集合中?或者它的订单已经关闭?在前一种情况下,共享收件箱是否可能尚未同步(如果您的代理已缓存)?

【讨论】:

对于排序,它不抓取最近的项目。它应该抓取一天前的物品,而不是抓取 3 天前收到的物品。如果我删除 .Sort "[ReceivedTime]" 它会从 3 个月前抓取一封电子邮件 - 所以排序正在做某事,只是没有一直到那里。所以这可能是共享收件箱的同步问题。知道如何确保 excel VBA 看到最新的共享收件箱吗? OOM 可以看到您在 Outlook 中看到的内容。您能否在代码运行的同时在同一台机器上的 Outlook 中看到正在思考的消息? 是的,我可以看到应该接收的最新消息。但是,在按 ReceivedTime 排序后,VBA 会抓取几天前(不是最近)发送的电子邮件。主题行也总是相同的。

以上是关于如何返回最近收到的电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能使用gmail -API从一个特定的发件人处收到最近5封电子邮件

最近收到邮件美国招聘软件工程师,说明缺人?

当消息中有法语口音时,我的邮件功能返回成功并且未收到邮件[重复]

最近收到邮件美国招聘软件工程师,说明缺人?

最近收到邮件美国招聘软件工程师,说明缺人?

虽然mail()返回true,但是没有收到邮件。是否配置有问题?