如何从 EWS 交换服务器访问特定电子邮件

Posted

技术标签:

【中文标题】如何从 EWS 交换服务器访问特定电子邮件【英文标题】:How to access specific email from EWS exchange server 【发布时间】:2019-09-13 19:21:33 【问题描述】:

我正在尝试使用 C# 从 EWS 获取特定电子邮件,但找不到识别特定电子邮件的方法。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
            service.Credentials = new WebCredentials(myemail, password);
            service.UseDefaultCredentials = false;
            service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
            ItemView itemsView = new ItemView(5);
            string querystring = "Kind:email";                

            FindItemsResults<Item> itemResults = service.FindItems(WellKnownFolderName.Inbox, querystring, view: itemsView);

FindItems 方法根据查询字符串提供电子邮件。我将EmailMessage.InternetMessageIdEmailMessage.Id 以及主题等详细信息保存在我的数据库中。就我而言,我可能会收到主题相同但正文内容略有不同的电子邮件。

稍后,根据用户操作,我想从 Exchange 服务器获取特定的电子邮件。有什么方法我可以使用并基于EmailMessage.InternetMessageIdEmailMessage.Id 获取电子邮件?这些身份证可靠吗?我在文档中找不到方法。目前我正在考虑根据主题阅读电子邮件,然后根据EmailMessage.Id.UniqueId 过滤结果

有没有什么好的替代方法可以从 Exchange 服务器获取特定的电子邮件?

【问题讨论】:

【参考方案1】:

IntenetMessageId 应该是唯一的,但不能保证它是唯一的,因为可以设置 Id 的不同进程的数量。

如果您想根据 InternetMessageId 获取特定消息,那么您需要使用扩展属性而不是强类型属性,例如

  String MessageID = "<blah@1223434556com">"
  ItemView ivew = new ItemView(3);
  service.TraceEnabled = true;
  ExtendedPropertyDefinition PidTagInternetMessageId = new ExtendedPropertyDefinition(4149, MapiPropertyType.String);
  SearchFilter sf = new SearchFilter.IsEqualTo(PidTagInternetMessageId, MessageID);
  FindItemsResults<Item> iCol = service.FindItems(WellKnownFolderName.Inbox, sf, ivew);

  foreach (Item item in iCol.Items)
  
    Console.WriteLine(item.Subject);
  

您可以使用 https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-export-items-by-using-ews-in-exchange 将消息导出到 EML 文件

【讨论】:

谢谢。 ExtendedPropertyDefinition 中的 4149 值代表什么?在文档中找不到详细信息。 如果消息 ID 不可靠,是否可以使用 EmailMessage.Id.UniqueId?基于此文档,我认为唯一 id 更可靠docs.microsoft.com/en-us/exchange/client-developer/… 这取决于您尝试对 InternetMessageId 进行的大多数操作执行的操作。使用 uniqueId 的问题是,如果消息在文件夹之间移动,这将会改变。否则,请查看 pidtagsearchkey 属性 docs.microsoft.com/en-us/office/client-developer/outlook/mapi/…

以上是关于如何从 EWS 交换服务器访问特定电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用 EWS API 从日记项目中提取附加的电子邮件 - 嵌入式项目 ID 为空

EWS 正文纯文本

如果地址是别名,如何使用 ews-java-api 识别收件人电子邮件?

Exchange Web 服务 (EWS) - 如何识别会议参与者是邮件组还是个人参与者

节点 js 中的 EWS 推送通知

如何在 Outlook 插件中访问 EWS `UniqueId` 字段