C#托管EWS通过共享邮箱的ID获取电子邮件

时间:2018-09-19 14:31:16

标签: c# exchangewebservices

我正在使用EWS通过控制台应用程序管理共享邮箱的电子邮件。

处理完它们后,将它们移动到共享收件箱下的另一个文件夹中(将消息ID保存到SQL记录之后)。

我想通过一个单独的过程使用ID来检索电子邮件。

使用代码时:

var email = EmailMessage.Bind(serviceInstance, new ItemId(id));

服务抛出此异常:

  

Microsoft.Exchange.WebServices.Data.ServiceResponseException:'在存储中找不到指定的对象。,该过程无法获取正确的属性。'

我知道该服务用户具有对收件箱和文件夹的权限,因为同一服务以前已经阅读过该收件箱并移动了电子邮件。

1 个答案:

答案 0 :(得分:0)

原因根据MS documentation是:

  

当您将电子邮件移动或复制到其他文件夹时,   在新文件夹中创建具有唯一项目ID的新项目,然后   原始邮件已删除。

因此,您会收到以下异常:The specified object was not found in the store.

如何解决?

在处理电子邮件消息之前,create a custom extended property并将其设置在电子邮件上并保存电子邮件,以与EWS服务器共享新状态。

Guid myPropertySetId = new Guid("{20B5C09F-7CAD-44c6-BDBF-8FCBEEA08544}"); 
ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "MyExtendedPropertyName", MapiPropertyType.String); 
message.SetExtendedProperty(myExtendedPropertyDefinition, "MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved");
message.SendAndSaveCopy(); 

在移动电子邮件之前,存储myExtendedPropertyDefinition的值(在上例中为"MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved")。然后,您可以将电子邮件移动到其目标文件夹。

在处理了原始电子邮件(已移动>删除)之后,可以通过find the email message at its new destination搜寻自定义属性和您存储的值来标识电子邮件:

ItemView view = new ItemView(5); 
SearchFilter searchFilter = new SearchFilter.IsEqualTo(myExtendedPropertyDefinition, "MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved"); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, myExtendedPropertyDefinition); 
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.SentItems, searchFilter, view); 

为每封电子邮件使用唯一的标识值,以获取一个搜索结果。

请注意,此解决方法是documentation中所述的(由MS提出)的正式建议方法。