您好我最近围绕EWS进行了开发。我遇到的一个问题是,客户端要求我将电子邮件导入数据库,他希望根据InternetMessageID检测重复项,这样他就不必导入重复的电子邮件,我的代码就来了点。
private static string GetInternetMessageID(Microsoft.Exchange.WebServices.Data.Item email)
{
EmailMessage emailMsg = email as EmailMessage;
string returnId = string.Empty;
if ((emailMsg != null)) {
try {
emailMsg.Load();
//loads additional info, without calling this ToRecipients (and more) is empty
} catch (ArgumentException ex) {
//retry
email.Load();
}
returnId = emailMsg.InternetMessageId;
} else {
//what to do?
}
return returnId;
}
我可以处理常规电子邮件,但是对于特殊的交换对象,例如联系人,日历,帖子等,它不起作用,因为它无法将其强制转换为EmailMessage对象。
我知道你可以从这些对象中提取internetMessageId。因为客户端曾经有另一个软件为他们提取这个ID,也许该属性不被称为internetMessageID,我想我可能不得不从internetMessageHeader中提取它。但是,当我尝试从item对象中获取它时,它只会抛出一个错误。如何从这些"特殊"获取互联网消息ID?交换项目?
PS我知道item.id.UniqueID然而这不是我想要的,因为如果我将项目从文件夹移动到另一个文件夹进行交换
答案 0 :(得分:1)
只有通过传输服务发送的对象才具有InternetMessageId,因此它们不是联系人和任务,因为它们不是消息,并且从未通过传输服务路由,所以永远不会有Internet MessageId。您可能希望查看使用一些属性来执行此操作InternetMessageId对消息有用PidTagSearchKey https://msdn.microsoft.com/en-us/library/office/cc815908.aspx是可以使用的(如果您对此有好处,则有各种使用此属性的示例)。
如果您要在Code中使用它,请不要使用您使用的方法在每个项目上加载属性,这是非常低效的,因为它将为每个对象单独调用。因为当我使用FindItems时,我们只需要检索256 Kb。例如
ExtendedPropertyDefinition PidTagSearchKey = new ExtendedPropertyDefinition(0x300B, MapiPropertyType.Binary);
ExtendedPropertyDefinition PidTagInternetMessageId = new ExtendedPropertyDefinition(0x1035, MapiPropertyType.String);
PropertySet psPropSet = new PropertySet(BasePropertySet.IdOnly);
psPropSet.Add(PidTagSearchKey);
psPropSet.Add(PidTagInternetMessageId);
ItemView ItemVeiwSet = new ItemView(1000);
ItemVeiwSet.PropertySet = psPropSet;
FindItemsResults<Item> fiRess = null;
do
{
fiRess = service.FindItems(WellKnownFolderName.Inbox, ItemVeiwSet);
foreach (Item itItem in fiRess)
{
Object SearchKeyVal = null;
if (itItem.TryGetProperty(PidTagSearchKey, out SearchKeyVal))
{
Console.WriteLine(BitConverter.ToString((Byte[])SearchKeyVal));
}
Object InternetMessageIdVal = null;
if (itItem.TryGetProperty(PidTagInternetMessageId, out InternetMessageIdVal))
{
Console.WriteLine(InternetMessageIdVal);
}
}
ItemVeiwSet.Offset += fiRess.Items.Count;
} while (fiRess.MoreAvailable);
如果你需要更大的属性,比如使用LoadPropertiesForItems方法的https://blogs.msdn.microsoft.com/exchangedev/2010/03/16/loading-properties-for-multiple-items-with-one-call-to-exchange-web-services/