[Exchange]使用EWS托管API2.0同步邮箱

你可以通过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

时间: 2024-08-02 04:55:46

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

Exchange Server 2013系列十二:邮箱的基本管理

杜飞 邮箱是 Exchange 组织中信息工作人员最常用的收件人类型.每个邮箱都与一个 Active Directory 用户帐户关联.用户可以使用邮箱发送和接收邮件,并可以存储邮件.约会.任务.便笺和文档.邮箱是 Exchange 组织中用户的主要邮件传递和协作工具.每个邮箱由 Active Directory 用户以及存储在 Exchange 邮箱数据库中的邮箱数据组成(如下图所示).邮箱的所有配置数据都存储在 Exchange 用户对象的 Active Directory 属性中.邮箱数据

Exchange混合部署场景中已经支持邮箱委派权限

在Exchange混合部署环境中目前已经支持本地Exchange邮箱和Office 365 Exchange Online邮箱之间的邮箱委派权限功能.场景介绍:例如本地邮箱需要赋予一个Exchange Online邮箱完全控制权限,反之一个Exchange Online邮箱需要赋予本地Exchange邮箱完全控制权限.不过目前支持的权限委派只支持 Full Access[完全控制] and Send on Behalf [代表发送(显示代表人)],不支持Send AS[发送为(不显示代表人)].

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

[from] http://www.cnblogs.com/love007/archive/2013/06/26/3156852.html 采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or assign this property before you can read its value  Body 如下: //*******************

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

自动化运维工具:ansible 多进程调用ansible api的应用场景:   应用系统检查 一个应用系统可能具有20-50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查,比如(df -h这种命令).但是深入到应用层的话,就有些个性化的应用了,比如有2台http服务器,有20台中间件服务器在加4台数据库服务器等等,检查项都是不同的.如果现在还要进行批量的系统检查,就不能用同一个playbook了.另外,如果顺序执行的话,等待时间就会非常长,而且没有必要,因为中间件的检

易宝典文章——怎样重新连接并恢复 Exchange Server 2013已删除的用户邮箱

邮箱禁用了,可以使用重新启用来恢复.那么如果用户邮箱被删除了呢?对于Exchange来讲依然可以支持在"保留已删除邮箱的期限"内轻松恢复被删除的用户邮箱数据.在此需要注意的是,恢复回来的邮箱已经不再是之前用户的邮箱了.因为在删除邮箱的时候,原有的用户就已经被删除了,即使新建同名用户再将之前的邮箱恢复给这个新用户,那也是另一个用户.所以,在此建议所有的管理员兄弟们,在做企业IT操作规范时,能用"禁用"解决的千万不要用"删除",否则,如果碰到需要重启

百度地图api2.0体验

前言:这两天在做百度地图的功能,查看了百度官网的api完成了基本功能 api地址http://developer.baidu.com/map/jshome.htm 注意是javascript API 大众版2.0 废话不说先上图 一.导入百度地图api <script type="text/javascript" src="/Scripts/jquery.min.js"></script> <script src="http:

Android Camera API2.0下全新的Camera FW/HAL架构简述

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2[email protected] Software:系统源码Android5.1 前沿: 前面博文大多少总结的是Camera HAL1到HAL3的系统架构,但这些架构对于Camera APP开发来说依旧还是处于Camera API1.0的标准.而随着Camera3.HAL3.0等的不断更新,Google先是在Framework中更改了整个架构从而去匹配Camera A

Exchange 2013 PowerShell管理联系人&通讯组&资源邮箱

管理联系人 创建联系人,使用如下语法: New-MailContact -Alias rjones ` -Name "Rob Jones" ` -ExternalEmailAddress [email protected] ` -OrganizationalUnit sales 已启用邮箱的用户可以使用如下语法: New-MailUser -Name 'John Davis' ` -Alias jdavis ` -UserPrincipalName [email protected]

Exchange Server 2013部署(三)邮箱角色和客户端访问角色安装

Exchange 2013的安装还是比较简单的:前面已经将安装Exchange Server 2013所要做的准备工作已经准备妥当,接下来就要开始正式安装了,我是将邮箱服务器角色和客户端访问角色分别部署,那接下来就先来安装邮箱服务器角色,插入光盘,运行"Setup",出现安装界面,这里我选择不检查更新,点击下一步: 进行文件复制 进行初始化设置 Introduction页选择下一步 协议许可界面勾选同意条款 选择自定义安装 勾选MailBox角色:由于是分开安装,所以这里我不选择客户端