我正在寻找从一台服务器到另一台服务器的可靠传输 caldav 条目——这是imapcopy
可以做的。我正在尝试使用Python caldav 实现,但我对协议的了解不够深入,无法知道如何从一台服务器迁移到另一台服务器。有没有明显的方法可以做到这一点?
1 回答
我认为没有现成的工具可以进行此类迁移,但是如果您精通 Python 和 urllib2,那么破解某些东西应该不会太难。
您想只传输一个日历,还是传输所有包含内容的日历?您能更准确地了解所涉及的服务器吗?它是否涉及共享日历?
真正困难的部分是会议。你想迁移这样的吗?如果这不是一个问题,那么它相对简单:
如果它只是一个日历,则基础很简单。在 CalDAV 中,日历是包含“iCalendar”资源的 WebDAV 集合。您可以按原样抓取它们并将它们转移到不同的服务器。您只需对日历 URL 执行 HTTP PROPFIND 即可找出集合中包含的资源的 URL。比您创建一个简单的 HTTP GET 来获取 iCalendar 资源,并将其放入目标服务器上的日历中。您甚至不需要在这里使用 CalDAV 库(即使是 WebDAV 库也有点过头了,您只需要解析 PROPFIND 的 XML 并使用 urllib2 来处理请求)。
获取日历中的资源 URL(事件和待办事项)的示例:
curl --verbose -u "login:pwd" -X PROPFIND -H "Depth: 1"
--data "<propfind xmlns='DAV:'><prop/></propfind>"
https://p00-caldav.icloud.com/xxx/calendars/work/
如果源服务器支持它(常见),您可以通过使用 multiget REPORT 来提高效率。如果目标服务器支持(很少),您可以通过使用 bulk-POST 来提高效率。一些服务器(如 iCloud)将附件存储在不同的位置。这可能需要额外的工作。
如果您还想传输日历,也不是太难,但涉及更多WebDAV。您需要通过在日历主页(包含所有日历的 URL)上执行 PROPFIND 来获取日历的所有属性(名称、颜色)。CalDAV 服务器的主页可以包含非日历,您可以通过查看 DAV:resourcetype 属性来确定这一点。对于日历,您可以使用 MKCOL 或 MKCALENDAR 在目标服务器上创建它们(这些方法可以获取您想要传输的属性)。
获取所有日历的名称、颜色等的示例:
curl --verbose -u "login:pwd" -X PROPFIND -H "Depth: 1"
--data "<propfind xmlns='DAV:'><allprop/></propfind>"
https://p00-caldav.icloud.com/xxx/calendars/