从Exchange Web服务托管API获取收件箱中的所有邮件,并将其存储为.eml文件

 心若繁花花满地 发布于 2023-02-09 13:53

我想使用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)什么这些ItemSchemaBasePropertySet

(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在控制台上连续打印.所以我必须理解pagesizeoffset错误.我想明白

(3)什么pagesize,offsetoffsetbasepointItemView构造方法

(4)他们的表现如何

(5)如何使用它们来检索收件箱中的所有邮件

我没有在网上发现任何文章,很好地解释这些,但只是提供代码示例.尽管可能需要很长时间,但仍会欣赏有问题的解释.

1 个回答
  • 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操作.

    2023-02-09 13:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有