在文件夹中找到具有给定地址的收件人

本文关键字:地址 收件人 文件夹 | 更新日期: 2023-09-27 18:07:58

我的公司需要一个插件,当我们第一次向收件人发送电子邮件时,可以自动向电子邮件添加优惠。

我的问题是:

如何检查这是否是用户第一次向收件人发送电子邮件?

我尝试了这个,但我收到错误,收件人是未知的属性。我也认为这不是正确的方法……

        object folderItem;
        Boolean AlreadyEmailed = false;
        if (mail != null)
        {
            const string PR_SMTP_ADDRESS =
                "http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
            Outlook.Recipients recips = mail.Recipients;
            foreach (Outlook.Recipient recip in recips)
            {
                Outlook.PropertyAccessor pa = recip.PropertyAccessor;
                string smtpAddress =
                    pa.GetProperty(PR_SMTP_ADDRESS).ToString();
                string filter = "[Recipient] = 'John@foo.com'";
                filter = filter.Replace("John@foo.com", smtpAddress);
                Debug.WriteLine(filter);
                folderItem = items.Restrict(filter);
                if(folderItem != null)
                {
                    Debug.WriteLine("We found items that have the filter");
                    AlreadyEmailed = true;
                }
                //Debug.WriteLine(recip.Name + " SMTP=" + smtpAddress);
            }
            if(!AlreadyEmailed)
            {
                Debug.WriteLine("This is the first time we email ... ");
            }

        }

在文件夹中找到具有给定地址的收件人

MailItem类的Sent属性返回一个布尔值,该值指示消息是否已发送。一般来说,有三种不同类型的消息:发送、发布和保存。已发送的邮件是发送到收件人或公用文件夹的项目。发布的消息将在公共文件夹中创建。保存的消息创建和保存,既不发送也不张贴。

您还可以使用以下扩展MAPI属性来处理消息状态(已回复/已转发):

  • pr_icon_index ( http://schemas.microsoft.com/mapi/proptag/0x10800003)
  • PR_LAST_VERB_EXECUTED (DASL名称为http://schemas.microsoft.com/mapi/proptag/0x10810003)
  • PR_LAST_VERB_EXECUTION_TIME (0 x10820040)

要获取这些值,请使用PropertyAccessor类(参见Outlook项目的相应属性)。

注意,新的Outlook项目没有EntryID属性设置。

您可以在Items.Find/Restrict中使用To/CC/BCC属性。请注意,在您的情况下最好使用Find,因为您只需要单个匹配,而不是所有匹配。还请注意,如果没有找到匹配项,Restrict将不会返回null,而是返回一个包含Items.Count == 0的Items集合。

话虽这么说,To/CC/BCC可能不包括地址,只有名字,所以搜索不会帮助你。你仍然可以循环遍历文件夹中的所有项目,并显式地检查每个项目的Recipients集合,但这将是非常低效的。

在扩展MAPI级别(c++或Delphi)上,可以在消息收件人(或附件)上创建子限制,但Outlook对象模型不公开该功能。

如果使用Redemption是一个选项(我是它的作者),它的Find/Restrict实现确实支持对Recipients集合的查询:

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set YourOutlookFolder = Application.ActiveExplorer.CurrentFolder
set rFolder = Session.GetFolderFromID(YourOutlookFolder.EntryID)
set rItems = rFolder.Items
set rMsg = rItems.Find("Recipients LIKE 'John@foo.com' ")
while not (rMsg Is Nothing)
  Debug.print rMsg.Subject
  set rMsg = rItems.FindNext
wend

在c#中(未测试):

Redemption.RDOSession Session = new Redemption.RDOSession();
Session.MAPIOBJECT = Application.Session.MAPIOBJECT;
set rFolder = Session.GetFolderFromID(YourOutlookFolder.EntryID);
Redemption.RDOMail rMsg = rFolder.Items.Find("Recipients LIKE 'John@foo.com' ") ;
AlreadyEmailed = rMsg != null;