Outlook加载项:检查是否是我们第一次向某人发送电子邮件

时间:2015-08-14 08:02:12

标签: c# outlook-addin

我们公司需要一个加载项,以便在我们第一次向收件人发送电子邮件时自动将电子邮件添加到电子邮件中。

我的问题是:

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

我尝试了这个,但收到了收件人不明身份的错误。我也认为这不是正确的方法......

        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 ... ");
            }


        }

1 个答案:

答案 0 :(得分:0)

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

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

在扩展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;