C# Managed EWS 通过 ID 从共享邮箱获取电子邮件

Posted

技术标签:

【中文标题】C# Managed EWS 通过 ID 从共享邮箱获取电子邮件【英文标题】:C# Managed EWS get email By ID from shared mailbox 【发布时间】:2018-09-19 14:31:15 【问题描述】:

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

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

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

使用代码时:

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

服务抛出此异常:

Microsoft.Exchange.WebServices.Data.ServiceResponseException: '在商店中找不到指定的对象。,进程未能获得正确的属性。'

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

【问题讨论】:

【参考方案1】:

原因根据 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); 

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

请注意,此解决方法是官方(由 MS)建议的方法,如 documentation 中所述。

【讨论】:

以上是关于C# Managed EWS 通过 ID 从共享邮箱获取电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

Powershell EWS 从共享邮箱发送电子邮件

EWS Managed Api 中的电子邮件对话/电子邮件线程支持(针对 Exchange 2010 左右)

如何在 C# 中使用 EWS API 设置类别标志颜色

使用 EWS 托管 API 创建共享邮箱

EWS 电子邮件文件夹所有者

在本机 C++ 中将变量从 C# 编组为 void*,并在本机程序内更改 Managed/C# 中的变量值