首页 > 解决方案 > 如何从 EWS 交换服务器访问特定电子邮件

问题描述

我正在尝试使用 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主题等详细信息。就我而言,我可能会收到主题相同但正文内容略有不同的电子邮件。

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

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

标签: c#office365exchange-serverexchangewebservices

解决方案


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

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

  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-将消息导出到 EML 文件作为交换


推荐阅读