首页 > 解决方案 > 在 SendItems 文件夹中过滤发送给用户的过去电子邮件

问题描述

问题陈述

我正在寻找一种方法来计算发送到特定电子邮件的任何电子邮件,逻辑是它已发送,它将位于“已发送项目”中。

问题

我正在使用下面的代码,我认为它接近正确但不起作用,即我没有得到计数。可能我错过了一些东西。如果有人有解决方案,想听听如何最好地做到这一点。

早期的尝试

  1. Items.Find("[To] = 'search@gmail.com'")
  2. Items.Restrict("[To] = 'search@gmail.com'") 他们都没有给我结果。

如何

注意:虽然代码适用于基于 ADX 的插件,但我相信问题并非特定于它。[代码]

    public int GetSentEmailExchangeCount(string SenderEmailId)
    {
        Outlook.MAPIFolder sentItems = (Outlook.MAPIFolder)this.OutlookApp.ActiveExplorer().Session.GetDefaultFolder((Outlook.OlDefaultFolders.olFolderSentMail));
        Outlook.Items folderItems = (Outlook.Items)sentItems.Items;
        string searchCriteria = "@SQL=\"urn:schemas:httpmail:displayto\" LIKE '%" + SenderEmailId + "%'";
        StringBuilder strBuilder = null;
        int counter = default(int);
        Outlook._MailItem mail = null;
        object resultItem = null;
        try
        {
            strBuilder = new StringBuilder();                
            resultItem = folderItems.Restrict(searchCriteria);
            while (resultItem != null)
            {
                if (resultItem is Outlook._MailItem)
                {
                    counter++;
                }
                Marshal.ReleaseComObject(resultItem);
                resultItem = folderItems.FindNext();
            }
        }
        catch (Exception ex)
        {
            Debug.Print(ex.Message);
        }
        finally
        {
            if (folderItems != null) Marshal.ReleaseComObject(folderItems);
        }        

        return counter;
    }

标签: outlookvstooutlook-addincomaddin

解决方案


当您搜索该To属性时,Outlook 会对消息属性创建一个限制,该限制PR_DISPLAY_TO可能包括也可能不包括电子邮件地址(通常只包括显示名称)。假设包含地址,您可以将搜索过滤器调整为

@SQL=To LIKE '%search@gmail.com%'

如果PR_DISPLAY_TO不包含电子邮件地址(至少不是所有电子邮件),则您在 Outlook 对象模型中无能为力。

在扩展 MAPI 级别(C++ 或 Delphi)上,您可以创建对收件人的限制 (RES_SUBRESTRICTION / PR_MESSAGE_RECIPIENTS)。

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

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Folder = Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
set restrItems = Folder.Items.Restrict(" TO = 'abc@example.com' ")

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

set restrItems = Folder.Items.Restrict(" Recipients = 'abc@example.com' ")

推荐阅读