繁体   English   中英

如何使用EWS托管API回复电子邮件?

[英]How to reply to an email using the EWS Managed API?

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

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

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

所以,为了实现这一点,我使用以下代码行EmailMessage.Bind(service,itemId);

要使此方法起作用,我必须从我的数据库中实例化ItemId,但ItemId构造函数仅将UniqueId作为参数,并使用null ChangeKey创建它。 如果我使用此ItemId(使用null ChangeKey),我会收到以下错误:Microsoft.Exchange.WebServices.Data.ServiceResponseException:在商店中找不到指定的对象。

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

而不是通过ItemId标识消息,而是使用EntryID。 使用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.Bind,请使用以下方法将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)。 如果您还列出了Move事件,您应该能够看到相应的move事件,该事件将具有与newMailEvent通知相关的OldItemId。

更改密钥仅在更新项目时很重要,因此如果您遇到错误,则表示您尝试的项目不存在(或已被移动),或者您无权使用UniqueId访问它完全没问题,请参阅https://msdn.microsoft.com/en-us/library/office/dn605828(v=exchg.150).aspx

干杯格伦

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM