使用Outlook VBA中的.Restrict方法筛选单个收件人电子邮件地址

时间:2013-04-29 19:29:23

标签: vba outlook outlook-vba outlook-2010 outlook-filter

我在Access中有代码可以获取用户收件箱中由个人电子邮件地址发送的所有电子邮件。这段代码(简化如下)工作正常:

Dim outItems as Outlook.Items
Dim strEMAddress as string
Dim outFolder as Outlook.MAPIFolder

Set outFolder = outNS.GetDefaultFolder(olFolderInbox)
Set outItems = outFolder.Items

str="my@email.com"

Set outItems = outItems.Restrict("[SenderEmailAddress] = " & "'" & strEMAddress & "'")

我正在寻找在SentMails文件夹上也会这样做的内容,将项目限制为发送到特定电子邮件地址的内容。

我知道这很复杂,因为.Recipients是一个集合(因为项目可以/确实有多个收件人)。我希望有一种方法可以在任何已发送的字段中返回包含我正在查找的电子邮件地址的项目列表(To / CC / bcc - 但如果这更容易,则只对To感到满意。)

我在网上搜索过并发现。这不好(不是电子邮件地址)我无法获得伪代码,比如这项工作:

 Set outItems = outItems.Restrict("[Recipients] = " & "'" & strEMAddress & "'")

3 个答案:

答案 0 :(得分:1)

如果使用Redemption是一个选项,则可以使用RDOFolder。Items.Restrict - 与Outlook对象模型不同,它确实将To / CC / BCC查询扩展为PR_DISPLAY_NAME上的收件人子限制每个收件人的PR_EMAIL_ADDRESS个属性(RES_SUBRESTRICTION / PR_MESSAGE_RECIPIENTS / RES_OR / PR_DISPLAY_NAME | PR_EMAIL_ADDRESS)。

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Folder = Session.GetFolderFromID(Application.ActiveExplorer.CurrentFolder.EntryID)
set restrItems = Folder.Items.Restrict(" TO = 'user@domain.demo' ")

您还可以在SQL查询中指定Recipients属性 - 它将与所有类型的收件人匹配(到/ cc / bb):

set restrItems = Folder.Items.Restrict(" Recipients = 'user@domain.demo' ")

答案 1 :(得分:1)

您可以将DASL查询用作 items.restrict 方法中的过滤字符串。

例如,要查找我发送给Ali Raza的所有邮件,请使用以下

str_fltr = "@SQL=""urn:schemas:httpmail:displayto"" ci_phrasematch '%Ali Raza%'"

上述DASL查询的好处是它返回与多个接收者的匹配,无论您是否使用jet语法进行搜索,结果xx将只包含具有一个收件人的项目。 Jet语法是您当前使用的语法。您应该使用 [To] 属性而不是 [收件人]

这里https://msdn.microsoft.com/en-us/library/cc513841%28v=office.12%29.aspx#SearchingOutlookData_Overview是一个很好的地方,你可以在那里学习几乎所有有关搜索的内容。

此处http://www.msoffice.us/Outlook/PDF/%28Outlook%202010%29%20Common%20DASL%20Property%20Tags.pdf是常见DASL标记的列表,如果您掌握DASL语法,它将派上用场。

答案 2 :(得分:0)

对于多个 [TO/CC/BCC] 过滤器示例将是......

Option Explicit
Public Sub Example()
    Dim olNs As Outlook.NameSpace
    Dim Folder As Outlook.MAPIFolder
    Dim Items As Outlook.Items
    Dim Filter As String
    Dim Msg As String
    Dim i As Long

    Set olNs = Application.GetNamespace("MAPI")
    Set Folder = olNs.GetDefaultFolder(olFolderSentMail)

    Filter = "@SQL=" & "urn:schemas:httpmail:displayto" & _
                       " Like '%John Doe%' Or " & _
                       "urn:schemas:httpmail:displaycc" & _
                       " Like '%John Doe%' Or " & _
                       "urn:schemas:httpmail:displaybcc" & _
                       " Like '%John Doe%'"

    Set Items = Folder.Items.Restrict(Filter)

    Msg = Items.Count & " Items in " & Folder.Name & " Folder"

    If MsgBox(Msg, vbYesNo) = vbYes Then
        For i = Items.Count To 1 Step -1
            Debug.Print Items(i) 'Immediate Window
        Next
    End If
End Sub

现在请记住,如果显示名称是 John.Doe@Email.com ,则过滤器应为%John.Doe@Email.com%,否则请使用%John Doe%

相关问题