如何使用 EWS Managed API 回复电子邮件?
How to reply to an email using the EWS Managed API?
我创建了一个使用 EWS Managed API 2.2 的应用程序。
此应用程序使用拉取通知来获取新电子邮件并将电子邮件的副本保存在数据库中。
然后在应用程序中我想从数据库中获取电子邮件并回复它。
为了回复消息,我需要使用我存储在数据库中的 ItemId 从 EWS 中检索它。
当然我可以创建一个新的 EmailMessage 并发送它,但是新的电子邮件将具有不同的 ConversationId,这对于应用场景来说是不可接受的。
因此,为了实现这一点,我使用了以下代码行
EmailMessage.Bind(服务, itemId);
为了使此方法起作用,我必须从我的数据库中实例化 ItemId,但 ItemId 构造函数仅将 UniqueId 作为参数,并使用 null ChangeKey 创建它。
如果我使用此 ItemId(具有 null ChangeKey),我会收到以下错误:
Microsoft.Exchange.WebServices.Data.ServiceResponseException: 在商店中找不到指定的对象。
我认为这是因为空的 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。
The specified object was not found in the store.
该错误通常意味着您无权访问您尝试访问的邮箱,或者您尝试访问的商品已不在商店中。例如,在拉取通知应用程序中,这可能意味着您收到通知的项目已被删除或移动到另一个文件夹(在这些情况下,项目将被分配一个新的 Id)。如果您还列出了 Move 事件,您应该能够看到相应的移动事件,该事件将具有与 newMailEvent 通知相关的 OldItemId。
Change Key 仅在您更新项目时才重要,因此如果您在 Bind 上遇到的错误意味着您尝试的项目不存在(或已被移动)或者您无权访问它仅与 UniqueId 绑定是完全可以的,另请参见 https://msdn.microsoft.com/en-us/library/office/dn605828(v=exchg.150).aspx
干杯
格伦
我创建了一个使用 EWS Managed API 2.2 的应用程序。 此应用程序使用拉取通知来获取新电子邮件并将电子邮件的副本保存在数据库中。
然后在应用程序中我想从数据库中获取电子邮件并回复它。 为了回复消息,我需要使用我存储在数据库中的 ItemId 从 EWS 中检索它。
当然我可以创建一个新的 EmailMessage 并发送它,但是新的电子邮件将具有不同的 ConversationId,这对于应用场景来说是不可接受的。
因此,为了实现这一点,我使用了以下代码行 EmailMessage.Bind(服务, itemId);
为了使此方法起作用,我必须从我的数据库中实例化 ItemId,但 ItemId 构造函数仅将 UniqueId 作为参数,并使用 null ChangeKey 创建它。 如果我使用此 ItemId(具有 null ChangeKey),我会收到以下错误: Microsoft.Exchange.WebServices.Data.ServiceResponseException: 在商店中找不到指定的对象。
我认为这是因为空的 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。
The specified object was not found in the store.
该错误通常意味着您无权访问您尝试访问的邮箱,或者您尝试访问的商品已不在商店中。例如,在拉取通知应用程序中,这可能意味着您收到通知的项目已被删除或移动到另一个文件夹(在这些情况下,项目将被分配一个新的 Id)。如果您还列出了 Move 事件,您应该能够看到相应的移动事件,该事件将具有与 newMailEvent 通知相关的 OldItemId。
Change Key 仅在您更新项目时才重要,因此如果您在 Bind 上遇到的错误意味着您尝试的项目不存在(或已被移动)或者您无权访问它仅与 UniqueId 绑定是完全可以的,另请参见 https://msdn.microsoft.com/en-us/library/office/dn605828(v=exchg.150).aspx
干杯 格伦