我正在使用EWS通过控制台应用程序管理共享邮箱的电子邮件。
处理完它们后,将它们移动到共享收件箱下的另一个文件夹中(将消息ID保存到SQL记录之后)。
我想通过一个单独的过程使用ID来检索电子邮件。
使用代码时:
var email = EmailMessage.Bind(serviceInstance, new ItemId(id));
服务抛出此异常:
Microsoft.Exchange.WebServices.Data.ServiceResponseException:'在存储中找不到指定的对象。,该过程无法获取正确的属性。'
我知道该服务用户具有对收件箱和文件夹的权限,因为同一服务以前已经阅读过该收件箱并移动了电子邮件。
答案 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提出)的正式建议方法。