C# 如何使用EWS管理的API回复电子邮件?

C# 如何使用EWS管理的API回复电子邮件?,c#,exchangewebservices,ews-managed-api,C#,Exchangewebservices,Ews Managed Api,我创建了一个使用EWS托管API 2.2的应用程序。 此应用程序使用拉通知获取新电子邮件,并将电子邮件副本保存到数据库中 然后在应用程序中,我想从数据库中获取电子邮件并回复它。 为了回复消息,我需要使用存储在数据库中的ItemId从EWS检索消息 当然,我可以创建一个新的EmailMessage并发送它,但是新的电子邮件将有一个不同的ConversationId,这在应用程序场景中是不可接受的 因此,为了实现这一点,我使用以下代码行 EmailMessage.Bind(服务,项目ID) 为了使这

我创建了一个使用EWS托管API 2.2的应用程序。 此应用程序使用拉通知获取新电子邮件,并将电子邮件副本保存到数据库中

然后在应用程序中,我想从数据库中获取电子邮件并回复它。 为了回复消息,我需要使用存储在数据库中的ItemId从EWS检索消息

当然,我可以创建一个新的EmailMessage并发送它,但是新的电子邮件将有一个不同的ConversationId,这在应用程序场景中是不可接受的

因此,为了实现这一点,我使用以下代码行 EmailMessage.Bind(服务,项目ID)

为了使这个方法能够工作,我必须从数据库实例化ItemId,但是ItemId构造函数只接受UniqueId作为参数,并使用null ChangeKey创建它。 如果使用此ItemId(带有null ChangeKey),则会出现以下错误: Microsoft.Exchange.WebServices.Data.ServiceResponseException:在存储中找不到指定的对象

我认为这是因为null ChangeKey。我说得对吗?
有解决方法吗?

使用EntryID而不是通过ItemId标识消息。使用EntryID,您可以绑定到同一封电子邮件,而无需更改密钥

以下是此类财产的定义:

ExtendedPropertyDefinition EntryIDProperty = new ExtendedPropertyDefinition(0x0FFF, MapiPropertyType.Binary);
在搜索邮件时,请确保指示EWS在检索到的项目列表中包含此类属性

以下是调用FindItems时获取EntryId的示例:

ExtendedPropertyDefinition EntryIDProperty = new ExtendedPropertyDefinition(0x0FFF, MapiPropertyType.Binary);

ItemView item_view = new ItemView(10) { PropertySet = new PropertySet(ItemSchema.Id, EntryIDProperty) };

var result = service.FindItems(WellKnownFolderName.Inbox, item_view);

foreach (var item in result.Items)
{
    byte[] entry_id = (byte[])item.ExtendedProperties.Single(x => x.PropertyDefinition == EntryIDProperty).Value;

    string entry_id_hex = ByteArrayToHexString(entry_id); //This is the entry ID that you should store
}
如果要使用EmailMessage.Bind,请使用以下方法将EntryID转换为ItemID:

此方法接受字符串EntryID

mailbox\u address
是邮箱的SMTP地址(例如。test@domain.com)

“服务”是ExchangeService对象

private ItemId ConvertEntryIdToItemId(string entryid, string mailbox_address, ExchangeService service)
{
    AlternateId id = new AlternateId(IdFormat.HexEntryId, entryid, mailbox_address);

    AlternateId new_id = (AlternateId)service.ConvertId(id, IdFormat.EwsId);

    ItemId item_id = new_id.UniqueId;

    return item_id;
}
现在,您可以使用返回的ItemId绑定电子邮件

在存储中找不到指定的对象

该错误通常意味着您没有尝试访问的邮箱的权限,或者您尝试访问的项目不再存在于存储中。例如,在pull notification应用程序中,这可能意味着通知您的项目已被删除或移动到另一个文件夹(在每种情况下,项目将被分配一个新Id)。如果您还列出了要移动的事件,您应该能够看到相应的移动事件,该事件将具有与newMailEvent通知相关的OldItemId

更改密钥仅在更新项目时才起作用,因此如果绑定时出现错误,则表示您尝试的项目不存在(或已被移动),或者您无权访问该项目,仅使用UniqueId绑定也完全可以,请参见

干杯 峡谷