在文件夹中找到具有给定地址的收件人
本文关键字:地址 收件人 文件夹 | 更新日期: 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;