设为首页 收藏本站
查看: 698|回复: 0

[经验分享] [Exchange]使用EWS托管API2.0同步邮箱

[复制链接]

尚未签到

发表于 2017-7-1 21:13:33 | 显示全部楼层 |阅读模式
  你可以通过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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390220-1-1.html 上篇帖子: RabbitMQ学习系列(四): 几种Exchange 模式 下篇帖子: windows server 2008 R2 SP1 安装exchange 2010
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表