你可以通过Exchange Web Serivice(EWS)托管API去检索从一个给定的时间点,文件夹中有变化的列表中的项。

客户端可以使用SyncFoldersItems方法,同步服务端的项目,你只需按照下面的做就可以了:

  • 执行初始同步操作(以检索指定文件家中的所有项目的列表)。
  • 周期性地执行随后的同步操作以检索自先前同步以来发生的项变更列表。

为了同步服务器上的每一项,客户端处理由方法SyncFolderItems方法返回的集合的变化,并应用这些变化到本地的每一项上。

SyncFolderItems方法是server to client的单向同步的。将客户端的更改备份到服务器端,客户端必须使用其他的EWS托管API的方法来创建、更新和删除必要的项目。

Note

SysncFolderItems方法最多返回512个变化,随后SyncFolderItems请求必须得到额外的变化。

SyncFolderItems方法和FindItem方法类似,但它不返回Body和Attachments属性。如果你需要这些属性,那就不能使用SyncFolderItems,我们建议您调用SyncFolderItems方法时指定IdOnly属性,然后使用LoadPropertiesForItems方法得到你需要的属性。

执行初始同步操作

1、调用SysncFolderItems方法并指定以下内容:包含同步数据的文件夹,属性将返回每个项目在响应,IDS对应的不同步数据应返回的项目的设置,一个表示变化应该返回的最大数量的整数,一个SysncFolderItems枚举值表明,同步数据应返回的项目的类型,和一个空的同步状态。指定一个空的同步状态使SysncFolderItems方法返回一个集合,表示在指定的文件夹,满足由其他输入参数指定的条件的所有项目。下面的代码显示如何请求在收件箱文件夹中包含的所有正常项目的列表(最多512个项目);响应中的每个文件夹将返回第一类属性集。连接配置信息是通过使用一个命名为服务对象提供exchangeservice。

ChangeCollection<ItemChange> icc = service.SyncFolderItems(new FolderId(WellKnownFolderName.Inbox), PropertySet.FirstClassProperties, null, 512, SyncFolderItemsScope.NormalItems, null);

2、保存同步状态供下次SyncFolderItems方法调用时使用。下面的示例演示如何访问SyncState状态,客户端存储该值,在之后调用SyncFolderItems方法时,使用该状态。

string sSyncState = icc.SyncState;

3、如果SyncFolderItems方法返回一个变化的列表,遍历该列表。

if (icc.Count == 0)
{Console.WriteLine("There are no items to synchronize.");
}
else
{foreach (ItemChange ic in icc){Console.WriteLine("ChangeType: " + ic.ChangeType.ToString());Console.WriteLine("ItemId: " + ic.ItemId.UniqueId);Console.WriteLine("Subject: " + ic.Item.Subject);Console.WriteLine("===========");//TODO: Create item on the client.
    }
}

执行随后的同步操作

1、调用syncfolderitems方法并指定以下内容:包含同步数据的文件夹,属性将返回每个项目在响应,IDS对应的不同步数据应返回的项目的设置,一个表示变化应该返回的最大数量的整数,一个syncfolderitemsscope枚举值表明,同步数据应返回的项目的类型,和同步状态值从现有的同步响应。下面的代码显示了如何请求一个列表中的所有更改到正常的项目,包含在收件箱文件夹(最多512个变化),自对应于指定的同步状态的时间,第一类属性集将返回为每个文件夹中的响应。连接配置信息是通过使用一个命名为服务对象提供exchangeservice。

ChangeCollection<ItemChange> icc = service.SyncFolderItems(new FolderId(WellKnownFolderName.Inbox), PropertySet.FirstClassProperties, null, 512, SyncFolderItemsScope.NormalItems, sSyncState);

2、如果SyncFolderItems方法返回了有变化的列表,枚举这个列表,并在客户端对其进行处理。

if (icc.Count == 0)
{Console.WriteLine("There are no item changes to synchronize.");
}
else
{foreach (ItemChange ic in icc){if (ic.ChangeType == ChangeType.Create){//TODO: Create item on the client.
        }else if (ic.ChangeType == ChangeType.Update){//TODO: Update item on the client.
        }else if (ic.ChangeType == ChangeType.Delete){//TODO: Delete item on the client.
        }else if (ic.ChangeType == ChangeType.ReadFlagChange){//TODO: Update the item's read flag on the client.
        }Console.WriteLine("ChangeType: " + ic.ChangeType.ToString());Console.WriteLine("ItemId: " + ic.ItemId.UniqueId);if (ic.Item != null){Console.WriteLine("Subject: " + ic.Item.Subject);}Console.WriteLine("===========");}
}

例子

下面的代码示例演示如何获取一个在收件箱中列表中的所有变化,由ssyncstate发生。这项改变在五批次检索,利用连续调用方法的syncfolderitems直到没有更多的变化为止。这个例子假设服务是一个有效的exchangeservice结合,ssyncstate代表同步状态,返回前调用syncfolderitems。

// Initialize the flag that will indicate when there are no more changes.
bool isEndOfChanges = false;// Call SyncFolderItems repeatedly until no more changes are available.
// sSyncState represents the sync state value that was returned in the prior synchronization response.
do
{// Get a list of changes (up to a maximum of 5) that have occurred on normal items in the Inbox folder since the prior synchronization.ChangeCollection<ItemChange> icc = service.SyncFolderItems(new FolderId(WellKnownFolderName.Inbox), PropertySet.FirstClassProperties, null, 5, SyncFolderItemsScope.NormalItems, sSyncState);if (icc.Count == 0){Console.WriteLine("There are no item changes to synchronize.");}else{foreach (ItemChange ic in icc){if (ic.ChangeType == ChangeType.Create){//TODO: Create item on the client.
            }else if (ic.ChangeType == ChangeType.Update){//TODO: Update item on the client.
            }else if (ic.ChangeType == ChangeType.Delete){//TODO: Delete item on the client.
            }else if (ic.ChangeType == ChangeType.ReadFlagChange){//TODO: Update the item's read flag on the client.
            }Console.WriteLine("ChangeType: " + ic.ChangeType.ToString());Console.WriteLine("ItemId: " + ic.ItemId.UniqueId);if (ic.Item != null){Console.WriteLine("Subject: " + ic.Item.Subject);}Console.WriteLine("===========");}}// Save the sync state for use in future SyncFolderHierarchy calls.sSyncState = icc.SyncState;if (!icc.MoreChangesAvailable){isEndOfChanges = true;}
} while (!isEndOfChanges);

总结

由于SyncFolderItems方法,返回的属性比较少,类似懒加载的方式,查询效率上比FindItems高很多,SyncFolderItems方法中的SyncState字符串,类似一个指针,下次同步开始的位置。所以在第一次的时候查询起来有点慢,这个时候可以通过SyncFolderItem方法的参数IdOnly,刷新第一次的状态,并使用文章中例子中的方式,获取当count为0的状态,然后客户端保存这个状态就行了,下次开始同步服务端的邮件使用这个状态查询,并在得到结果的情况下,在客户端更新该状态。以便下次使用。

参考

https://msdn.microsoft.com/en-us/library/office/ee693003

转载于:https://www.cnblogs.com/wolf-sun/p/5837761.html

[Exchange]使用EWS托管API2.0同步邮箱相关推荐

  1. Exchange笔记之使用OWA加密访问邮箱

    Exchange笔记之使用OWA加密访问邮箱 OWA是什么?呵呵,应该用惯Exchange的用户来说都知道,我在这里简单说下:OWA是一种给予Exchange客户端的一种B/S结构访问方式.OWA是O ...

  2. EWS API 2.0读取日历信息-读取内容注意事项

    采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or as ...

  3. 易宝典文章——如何在Exchange Server 2010 SP1下将用户邮箱导出到PST中

    易宝典:http://support.microsoft.com/kb/2604283/zh-cn 在很多情况下可能管理员需要将Exchange邮件服务器中用户邮箱的数据(邮件)进行导出.比如:需要提 ...

  4. vc++6.0 同步本机时间到Internet NTP服务器 编译通过

    vc++6.0 同步本机时间到Internet NTP服务器 编译通过 2009-07-24 23:50 #include <windows.h> #include <winsock ...

  5. magicui系统会不会升级鸿蒙,华为EMUI 11和Magic UI 4.0同步开启内测,均升级为鸿蒙系统...

    在昨天的华为开发者大会上,华为消费者业务软件部总裁王成录透露,EMUI 11和Magic UI 4.0同步开启内测. EMUI 11在今日正式开启Beta版本,支持华为P40.Mate 30.Mata ...

  6. android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

    1.Camera2 preview的应用层流程分析 preview流程都是从startPreview开始的,所以来看startPreview方法的代码: <code class="hl ...

  7. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  8. android6.0源码分析之Camera API2.0简介

    1.Camera API2.0的架构图 Camera API2.0下的Camera架构与API1.0有所区别,下面将给出Camera API2.0以及Camera HAL3.2+下的Camera的总体 ...

  9. 如何在 Exchange Server 2010 SP1 下将用户邮箱导出到PST中

    本文转自微软帮助与支持社区,感谢原帖作者给我们分享如此实用的技术! 原文地址:http://support.microsoft.com/kb/2604283/zh-cn 在实际操作中我发现了一些小小的 ...

最新文章

  1. EI:生物膜反应器抗性组对替加环素浓度升高的动态响应
  2. openssl的实践应用
  3. orcale存储过程学习之路(一)
  4. Java番外篇2——jdk8新特性
  5. mysql 免安装重装_mysql 重装问题
  6. 为什么8位有符号数的范围为“-128 — +127”?(转载加补充)
  7. C#使用Parallel处理数据同步写入Datatable并使用BulkInsert批量导入数据库
  8. 组件、控件和插件的区别
  9. delphi调试需要管理员权限程序报错“Unable to create process:请求的操作需要提升”
  10. 推荐一款(网站图片储存)网站图片外链
  11. 除尘器选型需要考虑的因素
  12. fleck 客户端_C#中使用Fleck实现WebSocket通信简例
  13. 1.7.1 计算机网络体系结构的形成
  14. idea中ctrl+shift+f(在文件中查找)失效,全图文解决方案
  15. 2018乌镇峰会 -- 完美世界萧泓论道互联网与文化交流
  16. 深圳云计算培训学习:构建企业级WIKI及工单系统 --【千锋】
  17. steam助手_Steam的冬季特卖来了!
  18. 机动车年审经过(佛山南海)
  19. _C.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN2at19UndefinedTensorImpl10_singletonE
  20. 使用ArcGIS制作专题图,并添加经纬网

热门文章

  1. android 快速开发常用工具类,实例详解Android快速开发工具类总结
  2. 大球分析系统_烧成系统如何提高熟料后期强度
  3. 浙江科技学院计算机专业录取分数线,浙江科技学院2017年艺术类本科专业录取分数线...
  4. 如何部署php论坛系统,Discuz论坛系统搭建
  5. FPGA设计心得(11)关于FIFO IP核使用的一点注意事项
  6. FPGA之道(56)状态的编码方式
  7. Ellipse(椭圆)
  8. 数据库持久层封装设计
  9. ES6 实用开发技巧
  10. 《C++面向对象高效编程(第2版)》——导读