我有一个要求。我需要访问公司特定域上的用户电子邮件。我需要获取该用户的日历并将其发布到 Web 应用程序。我筋疲力尽地找到任何可以帮助我做到这一点的 API。公司使用的电子邮件客户端是Thunder Bird,因此,具体来说,我需要为该特定用户访问Thunder Bird的日历。谁能告诉我一些建议。
Kumar
您的问题非常不精确(提供电子邮件/日历的服务器是什么样的?是否有 LDAP 域?等等)。我想您正在谈论旧的Exchange服务器,因为某些域和WebDAV以及搜索时的问题?但我也许可以给你至少一点帮助,这可能会引导你走上其他编码人员已经走过的路,这样你就可以找到一个简单快速的解决方案。
今天,我完成了M$ Exchange 2003连接器作为概念验证。我告诉你,作为一名学生,在实习期间,这对我来说真的很困难。尽管如此,我还是研究、搜索、查询和惹恼其他人以获得有用 API 的提示,但没有一个能满足我的目的。
我发现一个很好用的小框架叫做Sardine WebDAV Client for Java。该项目非常轻量级,尽管了解 WebDAV 的工作原理很有帮助,即使由于您可以随时查看的来源。
所有其他解决方案都针对许多不同的 MAPI CC++ Libs for Linux。这对我来说是没有选择的。
那么,我有什么选择呢?没有直接访问客户的Exchange 2k3服务器,但有一个电子邮件帐户。所以你们都可以原谅我,但我发现通过 OWA 向 E2k3 服务器发出 POST 请求要容易得多,因为它被激活了,而不是尝试一些繁重的 lib 支持的访问方式。
也许这会为您提供帮助 - 从 OWA 表单中获取表单字段信息,并构建您发布到服务器的连接字符串。也许这是一个字符串,可能会给你一个想法。所以你需要像这样调用一个 DLL:
HttpPost httpPost = new HttpPost("https://" + getUrl()
+ "/exchweb/bin/auth/owaauth.dll");
httpPost.setEntity(new StringEntity("destination=https%3A%2F%2F"
+ getUrl() + "%2Fexchange%2F&flags=0&username=" + getUser()
+ "&password=" + getPassword()
+ "&SubmitCreds=Log+On&trusted=4&flags=4", "UTF-8"));
有关如何进行基于表单的身份验证的信息来自此处:Exchange 2003 基于表单的身份验证。如您所见,我从浏览器中抓取了用于与E2k通信的链接。下一步很简单 - 发送请求并等待...
HttpResponse response = httpclient.execute(httpPost);
如果得到良好的响应作为回报,则可以过滤掉会话 ID。成功登录后的下一步是搜索约会。因此,您应该通过向 M$ 询问一些信息来找到一种合适的方法来在已建立的 WebDAV 连接上使用: 搜索方法
然后,您阅读它可以做什么。我继续使用一个著名的查找机器,并使用WebDAV查询搜索日历文件夹。
之后,您可以创建如下所示的 POST 请求:
HttpPost hp = new HttpPost(
"https://owa.SERVER.de/exchange/USER/Calendar") {
@Override
public String getMethod() {
return "SEARCH";
}
};
现在您可以使用搜索方法。这很好,因为您的程序已准备好发送请求。
hp.setEntity(new StringEntity(QUERY, ContentType.TEXT_XML));
HttpResponse response = httpclient2.execute(hp);
我知道这不是完美的解决方案。因为有两种情况让我感到疑惑。首先:我检索了一个会话ID,但我不需要在任何地方重复使用它,只要我把它保存在一个字段中。其次:我需要调用另一个HttpClient。我现在无法解释。如果我使用与登录相同的 HttpClient,那么所有请求都是徒劳的。这就是为什么我不得不调用另一个HttpClient。
最后也是最困难的步骤是支持查询,因为我唯一的调试帮助是HTTP错误号和MSDN中的错误描述。对不起。嗯,这才是真正有效的。我通过反复试验支持它。
private final static String QUERY = "<?xml version="1.0"?><g:searchrequest
xmlns:g="DAV:"><g:sql> Select "DAV:href", "urn:schemas:calendar:dtstart",
"urn:schemas:calendar:dtend", "urn:schemas:mailheader:subject",
"urn:schemas:calendar:duration" FROM Scope('SHALLOW TRAVERSAL OF
"/exchange/USER/Calendar"')</g:sql></g:searchrequest>";
这不是特别的查询。我只是从另一个文档中交替使用它,并删除了所有不需要的东西。
我希望这对你有所帮助。关于提供雷鸟约会/日历日期,我什么也说不出来,因为这还超出了我的知识范围。
最好的问候和晚安,
塞莫