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

前端之家收集整理的这篇文章主要介绍了[Exchange]使用EWS托管API2.0同步邮箱前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<p style="margin-left: 30px;">你可以通过Exchange Web Serivice(EWS)托管API去检索从一个给定的时间点,文件夹中有变化的列表中的项。


<p style="margin-left: 30px;">客户端可以使用SyncFoldersItems方法,同步服务端的项目,你只需按照下面的做就可以了:

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

方法SyncFolderItems方法返回的集合的变化,并应用这些变化到本地的每一项上。

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

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

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

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

ChangeCollection icc = service.SyncFolderItems( FolderId(WellKnownFolderName.InBox),PropertySet.FirstClassProperties,,,SyncFolderItemsScope.NormalItems,);

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

sSyncState = icc.SyncState;

方法返回一个变化的列表,遍历该列表。

(icc.Count == (ItemChange ic + + + </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;TODO: Create item on the client.</span>

<span style="color: #000000;"> }
}

执行随后的同步操作

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

ChangeCollection icc = service.SyncFolderItems( FolderId(WellKnownFolderName.InBox),sSyncState);

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

(icc.Count == (ItemChange ic (ic.ChangeType == (ic.ChangeType == (ic.ChangeType == (ic.ChangeType == Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ChangeType: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.ChangeType.ToString()); Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ItemId: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.ItemId.UniqueId); </span><span style="color: #0000ff;"&gt;if</span> (ic.Item != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) { Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Subject: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.Item.Subject); } Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;===========</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;); }

}

例子

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

isEndOfChanges = <span style="color: #008000;">//<span style="color: #008000;"> Call SyncFolderItems repeatedly until no more changes are available.
<span style="color: #008000;">//
<span style="color: #008000;"> sSyncState represents the sync state value that was returned in the prior synchronization response.

<span style="color: #0000ff;">do<span style="color: #000000;">
{
<span style="color: #008000;">//<span style="color: #008000;"> 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 icc = service.SyncFolderItems(<span style="color: #0000ff;">new FolderId(WellKnownFolderName.InBox),<span style="color: #800080;">5<span style="color: #000000;">,sSyncState);

</span><span style="color: #0000ff;"&gt;if</span> (icc.Count == <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)
{
    Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;There are no item changes to synchronize.</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
}
</span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;
{
    </span><span style="color: #0000ff;"&gt;foreach</span> (ItemChange ic <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; icc)
    {
        </span><span style="color: #0000ff;"&gt;if</span> (ic.ChangeType ==<span style="color: #000000;"&gt; ChangeType.Create)
        {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;TODO: Create item on the client.</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">else <span style="color: #0000ff;">if (ic.ChangeType ==<span style="color: #000000;"> ChangeType.Update)
{
<span style="color: #008000;">//<span style="color: #008000;">TODO: Update item on the client.
<span style="color: #000000;"> }
<span style="color: #0000ff;">else <span style="color: #0000ff;">if (ic.ChangeType ==<span style="color: #000000;"> ChangeType.Delete)
{
<span style="color: #008000;">//<span style="color: #008000;">TODO: Delete item on the client.
<span style="color: #000000;"> }
<span style="color: #0000ff;">else <span style="color: #0000ff;">if (ic.ChangeType ==<span style="color: #000000;"> ChangeType.ReadFlagChange)
{
<span style="color: #008000;">//<span style="color: #008000;">TODO: Update the item's read flag on the client.
<span style="color: #000000;"> }

        Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ChangeType: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.ChangeType.ToString());
        Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;ItemId: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.ItemId.UniqueId);
        </span><span style="color: #0000ff;"&gt;if</span> (ic.Item != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;)
        {
            Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Subject: </span><span style="color: #800000;"&gt;"</span> +<span style="color: #000000;"&gt; ic.Item.Subject);
        }
        Console.WriteLine(</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;===========</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;);
    }
}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Save the sync state for use in future SyncFolderHierarchy calls.</span>
sSyncState =<span style="color: #000000;"&gt; icc.SyncState;

</span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;icc.MoreChangesAvailable)
{
    isEndOfChanges </span>= <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
}

} <span style="color: #0000ff;">while (!isEndOfChanges);

总结

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

原文链接:https://www.f2er.com/csharp/191522.html

猜你在找的C#相关文章