你可以通过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, , SyncFolderItemsScope.NormalItems, null);

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

string sSyncState = icc.SyncState;

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

if (icc.Count == )
{
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, , SyncFolderItemsScope.NormalItems, sSyncState);

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

if (icc.Count == )
{
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, , SyncFolderItemsScope.NormalItems, sSyncState); if (icc.Count == )
{
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

[Exchange]使用EWS托管API2.0同步邮箱的更多相关文章

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

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

  2. python-ansible api2.0 多进程执行不同的playbook

    自动化运维工具:ansible 多进程调用ansible api的应用场景:   应用系统检查 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查, ...

  3. ansible api2.0 多进程执行不同的playbook

    自动化运维工具:ansible 多进程调用ansible api的应用场景:   应用系统检查 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查, ...

  4. asp.net web api2.0 ajax跨域解决方案

    asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种.  一,ASP.NET Web API支持JSONP,分两种 1, ...

  5. Lotus 迁移到Exchange 2010 之准备使用Transport 同步Lotus 相关信息!

    这里我们先来分析下Lotus迁移到Exchange2010 的一些原理,由于存在一定周期的共存时间,因此在共存期间必须来实现相应的同步计划,整个同步计划包含了如下的同步计划:

  6. 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)

    注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...

  7. 用户收到"无法显示页面"的错误消息和"Connections_refused"条目记录在运行 Windows Server 2003,Exchange 2003 和 IIS 6.0 的服务器上的 Httperr.log 文件

    症状 您会遇到下列症状在运行 Microsoft Windows Server 2003. Microsoft Exchange Server 2003年和 Microsoft Internet In ...

  8. Logstash-5.0同步.json文件到ElasticSearch-5.0配置文件

    logstash/conf/input-file.conf内容如下: input { file { #监听文件的路径. path => ["E:/data_json/*.json&qu ...

  9. 百度地图api2.0体验

    前言:这两天在做百度地图的功能,查看了百度官网的api完成了基本功能 api地址http://developer.baidu.com/map/jshome.htm 注意是javascript API ...

随机推荐

  1. Ubuntu下matlab快捷键设置

    ubuntu15.04, matlab2016a 默认按键ctrl+s无法保存,ctrl+z无法撤销.因为用的是emacs的快捷键.emacs的快捷键不熟悉会觉得很复杂,果断改为windows风格的: ...

  2. Ubuntu下root密码认证错误

    1.默认root密码是随机的,即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo passwd root,然后输入当前用户的密码,再输入要设置root的密码,我们一般设置成两个都一样 ...

  3. C语言之流的重定向

    写c的小程序断不了需要输入输出,手动输入可太麻烦了.下面介绍IO的重定向方式: .重定向标准输入输出和错误,直接在命令行使用符号< > > >> >>等,还可 ...

  4. BZOJ2005 莫比乌斯反演

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 实际上把这些被挡住的点的坐标和能量值列举出来可以发现有个公式: “对于坐标系第一象限任意 ...

  5. 洛谷P1629 邮递员送信

    题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...

  6. 分析ffmpeg解析ts流信息的源码

    花费一些时间,然后全部扔了.为了不忘记和抛砖引玉,特发此贴. ffmpeg解析ts流 1.目的     打算软件方式解析出pat,pmt等码流信息 2.源代码所在位置         下载ffmpeg ...

  7. UVa 7146 Defeat the Enemy(贪心)

    题目链接: 传送门 Defeat the Enemy Time Limit: 3000MS     Memory Limit: 32768 KB Description Long long ago t ...

  8. MooseFs-分布式文件系统系列(四)之简单聊聊MFS的日常维护

    回顾 文件或目录的额外属性(noower,noattracache和noentrycache),可以通过MFS提供的命令(mfsgeteattr,mfsseteattr,mfsdeleattr等)检查 ...

  9. uC/OS-II任务(OS_task)块

    /*************************************************************************************************** ...

  10. Tomcat 的 ErrorPage 实现原理分析

    使用Tomcat,一定见到过404,500的时候,见到过Tomcat提供的错误页面,例如请求的资源找不到的时候,响应状态码为404,这个时候的错误页面是这样的: 这些错误页面是 如何生成及定位展示的  ...