如何使用EWS Managed API回复邮件

本文关键字:回复 API Managed 何使用 EWS | 更新日期: 2023-09-27 18:11:20

我已经创建了一个使用EWS管理API 2.2的应用程序。这个应用程序使用拉通知来获取新邮件,并在数据库中保存电子邮件的副本。

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

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

因此,为了实现这一点,我使用了下面的代码行EmailMessage。绑定(服务,itemId);

对于这个方法的工作,我必须从我的数据库实例化ItemId,但ItemId构造器只把UniqueId作为参数,并使用null ChangeKey创建它。如果我使用这个ItemId (null ChangeKey),我得到以下错误:Microsoft.Exchange.WebServices.Data.ServiceResponseException:指定的对象没有在存储中找到。

我认为这是因为null ChangeKey。我说的对吗?有什么解决办法吗?

如何使用EWS Managed API回复邮件

使用EntryID代替ItemId标识消息。使用EntryID,您可以绑定到相同的电子邮件,而不需要ChangeKey。

这个属性的定义如下:

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,请使用以下方法将EntryID转换为ItemID。绑定:

这个方法接受字符串EntryID。

mailbox_address是邮箱的SMTP地址(例如test@domain.com)

'service'是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来绑定您的EmailMessages

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

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

更改键只在你更新一个项目时起作用,所以在这种情况下,你在绑定上得到的错误意味着你正在尝试的项目不存在(或已被移动),或者你没有访问它的权利,只绑定UniqueId是完全可以的,参见https://msdn.microsoft.com/en-us/library/office/dn605828(v=exchg.150).aspx

干杯格伦