我想使用EWS托管API获取收件箱文件夹中的所有邮件并将其存储为.eml
.问题是在获取(1)所有与邮件(2)所有的标题(如发件人,收件人,主题)(这些值的我保持信息from
,to
以及其他属性别的地方,所以我需要他们太)和(3)byte[] EmailMessage.MimeContent.Content
.其实我对此缺乏了解
Microsoft.Exchange.WebServices.Data.ItemView
,
Microsoft.Exchange.WebServices.Data.BasePropertySet
和
Microsoft.Exchange.WebServices.Data.ItemSchema
这就是为什么我发现它很难.
我的主要代码是:
当我创建PropertySet
如下:
PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent);
我得到以下异常:
The property MimeContent can't be used in FindItem requests.
我不明白
(1)什么这些ItemSchema
和BasePropertySet
有
(2)我们应该如何使用它们
所以我删除了ItemSchema.MimeContent
:
PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties);
我编写了简单的以下代码来获取收件箱中的所有邮件:
ItemView view = new ItemView(50); view.PropertySet = properties; FindItemsResults- findResults; List
emails = new List (); do { findResults = service.FindItems(WellKnownFolderName.Inbox, view); foreach (var item in findResults.Items) { emails.Add((EmailMessage)item); } Console.WriteLine("Loop"); view.Offset = 50; } while (findResults.MoreAvailable);
上面我将页面大小保持ItemView
为50,一次检索不超过50封邮件,然后将其抵消50以获得下一封50封邮件(如果有的话).然而,它进入无限循环并Loop
在控制台上连续打印.所以我必须理解pagesize
和offset
错误.我想明白
(3)什么pagesize
,offset
并offsetbasepoint
在ItemView
构造方法
(4)他们的表现如何
(5)如何使用它们来检索收件箱中的所有邮件
我没有在网上发现任何文章,很好地解释这些,但只是提供代码示例.尽管可能需要很长时间,但仍会欣赏有问题的解释.
EWS与各种操作返回的属性有点不一致.Item.Bind不会返回与FindItem完全相同的属性.您正在使用PropertySets,只要在服务器上定义您想要的内容,但您必须在正确的位置使用它们.您需要做的是找到项目,然后将属性加载到它们中.这不是理想的,但这就是EWS的工作方式.使用循环时,当你需要将它增加50时,你会不断地为你的偏移量分配50.在我的头顶上,这样的事情会:
int offset = 0; int pageSize = 50; bool more = true; ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning); view.PropertySet = PropertySet.IdOnly; FindItemsResults<Item> findResults; List<EmailMessage> emails = new List<EmailMessage>(); while(more){ findResults = service.FindItems(WellKnownFolderName.Inbox, view); foreach (var item in findResults.Items){ emails.Add((EmailMessage)item); } more = findResults.MoreAvailable; if (more){ view.Offset += pageSize; } } PropertySet properties = (BasePropertySet.FirstClassProperties); //A PropertySet with the explicit properties you want goes here service.LoadPropertiesForItems(emails, properties);
现在,您拥有了所有具有所请求属性的项目.FindItems通常不会返回您想要的所有属性,因此最初只加载Id然后加载您想要的属性通常是要走的路.您可能还希望以某种方式批量加载属性,具体取决于您检索的电子邮件数量,可能在将其添加到EmailMessages列表之前的循环中.您还可以考虑其他获取项的方法,例如service.SyncFolder操作.