首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sogo CardDav支持

Sogo CardDav支持
EN

Stack Overflow用户
提问于 2016-01-23 04:20:13
回答 2查看 1.4K关注 0票数 1

我正在尝试使用CardDav从Sogo群件系统中检索联系人列表( .vcf格式)。我已经成功地在其他系统中使用了我的代码,但是Sogo不能像我期望的那样工作。我将URL设置为:

代码语言:javascript
复制
https://<server>/SOGo/dav/<user>/Contacts/personal/

用户id和密码被提供给libcurl。该命令使用以下xml进行报告:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<card:addressbook-query d="DAV:"xmlns:card="urn:ietf:params:xml:ns:carddav">
<d:prop>
<d:getetag />
<card:address-data>
</card:address-data>
</d:prop>
<card:filter>
<card:prop-filter name="FN">
</card:prop-filter>
</card:filter>
</card:addressbook-query>

对于其他系统,此查询将生成一个包含多个vcard条目的文件,这正是我想要的。对于Sogo,我得到的只是:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
</D:multistatus>

我注意到,对上面的URL执行PROPFIND命令会给出一个非常大的文件,其中包含多个URL,每个联系人条目一个。这些实际上是可以工作的,但它将会慢得多,可能需要执行数千个GETs来逐个检索它们。有人知道我的地址簿查询出了什么问题吗?

相关问题:我想对日历做基本上相同的事情(稍有不同的xml输入),并且有相同的问题。但是,有一个变通方法,我可以对此URL执行GET:

代码语言:javascript
复制
https://<server>/SOGo/dav/<user>/Calendar/personal.ics

然后我就得到了我想要的整个.ics文件。然而,似乎没有一个等效的URL可以用于联系人-我错了吗?

EN

回答 2

Stack Overflow用户

发布于 2016-01-23 22:46:03

对我来说,逆向SOGoCardDAV实现看起来有点--比如说“简单”--:

https://github.com/inverse-inc/sogo/blob/907c30061f413fe2d250cddf348db6b4fc26b143/SoObjects/Contacts/SOGoFolder%2BCardDAV.m

虽然它看起来应该返回所有卡片,如果查询太复杂(不是filters provided,他们指的是no filters we can handle ...):

代码语言:javascript
复制
// If no filters are provided, we return everything.

但是这个更改是几个月前才实现的,也许您的SOGo安装还没有它?:

https://github.com/inverse-inc/sogo/commit/907c30061f413fe2d250cddf348db6b4fc26b143

代码语言:javascript
复制
2.3.3 (2015-mm-dd)
...
- we now return all cards when we receive an empty addressbook-query REPORT
...

摘要:这个特定的查询应该可以在当前的SOGo (>=2.3.3?)中工作,尽管实现仍然离RFC还很远;->

*话虽如此*:这有点取决于你的客户端类型,但你所做的是相当不常见的(使用addressbook-query来获取所有卡片)。该查询只有在没有本地存储的Web客户端上才有意义。常规同步客户端通常使用WebDAV sync-report来保存etags/URL列表,然后使用WebDAV multiget报告来获取已更改的项。

我注意到上述网址的PROPFIND命令将给我一个非常大的文件,其中包含多个URL,每个联系人条目一个。这些实际上是可以工作的,但是它将会慢得多,可能需要执行数千个GETs来逐个检索它们

您可以使用PROPFIND来抓取所有的GET,然后如上所述的一个或一批multiget报告而不是单个URL。我之所以说“批处理”,是因为在一个HTTP请求中获取所有vCards通常会给非流媒体服务器带来很大的负载/内存压力(很多是,对SOGo不确定--可能是流媒体)。

如上所述,仍然不推荐使用PROPFIND。相反,使用sync-report仅获取已更改的URL(第一个响应将很大,但随后仅传输diffs )。

相关的问题:我想对日历做基本上相同的事情(稍有不同的xml输入),并且有相同的问题。

您需要提供XML。虽然同样的事情也适用于上面。calendar-query通常不用于获取所有事件。将sync-reportmultiget结合使用。

我不认为在SOGo的联系人文件夹上定义了GET,而且我认为这在一般的CardDAV服务器上是相当不常见的(与CalDAV服务器不同)。

票数 1
EN

Stack Overflow用户

发布于 2017-05-14 18:46:33

Sogo群件系统不是符合标准的CardDAV服务器。但是,您可以使用WebDAV客户端连接到CardDAV通讯簿,并将其作为文件夹打开。该文件夹包含单独的vCards文件(即使它们可能没有vcf扩展名),可以下载这些文件,然后将其导入到另一个通讯簿中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34955255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档