3

我在 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 不好(不是电子邮件地址),我无法获得像这样的伪代码:

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

3 回答 3

2

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

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

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

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

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

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

于 2015-04-25T09:59:32.773 回答
2

对于多个[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%

于 2017-04-22T00:44:01.067 回答
1

如果可以选择使用Redemption,则可以使用 RDOFolder。Items.Restrict - 与 Outlook 对象模型不同,它确实将 To/CC/BCC 查询扩展到每个收件人的收件人子限制PR_DISPLAY_NAMEPR_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' ")

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

set restrItems = Folder.Items.Restrict(" Recipients = 'user@domain.demo' ")
于 2013-04-30T17:56:28.483 回答