1

我有一个要求。我需要访问公司特定域上的用户电子邮件。我需要获取该用户的日历并将其发布到 Web 应用程序。我已经筋疲力尽地寻找任何可以帮助我做到这一点的 API。公司使用的电子邮件客户端是 Thunder Bird,所以,具体来说,我需要从 Thunder Bird 访问该特定用户的日历。谁能告诉我一些建议。

4

1 回答 1

0

库马尔

您的问题非常不精确(提供电子邮件/日历的服务器是什么样的?是否有 LDAP 域?等等)。我想您是在谈论旧的 Exchange Server,因为某些域和 WebDAV 以及搜索时的问题?但我也许可以给你至少一点帮助,这可能会让你走上其他程序员已经走过的路,这样你就可以找到一个简单快速的解决方案。

今天我完成了一个 M$ Exchange 2003 连接器作为概念验证。我告诉你,作为一名学生,我在实习期间真的很难。尽管如此,我还是研究、搜索、查询和惹恼了其他人,以获取有用 API 的提示,但没有一个能够实现我的目的。

我发现一个很好用的小框架叫做Sardine WebDAV Client for Java。该项目非常轻量级,尽管它有助于了解 WebDAV 的工作原理,即使您可以随时查看来源。

所有其他解决方案都针对许多不同的适用于 Linux 的 MAPI CC++ 库。这对我来说是没有选择的。

那么,我有什么选择?不能直接访问客户的 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 Forms-Based Authentication。如您所见,我从浏览器中获取了用于与 E2k 通信的 Link。下一步很简单 - 发送请求并等待...

HttpResponse response = httpclient.execute(httpPost);

如果您得到了良好的响应,那么您可以过滤掉 Session ID。成功登录后的下一步是搜索约会。因此,您应该通过向 M$ 询问一些信息来找到在已建立的 WebDAV 连接上使用的适当方法:搜索方法

然后,您阅读它可以做什么。我继续使用著名的 Find-Machine 并查询Searching Calendar Folders with WebDAV

之后,您可以像这样创建一个 POST 请求:

HttpPost hp = new HttpPost(
    "https://owa.SERVER.de/exchange/USER/Calendar") {
     @Override
     public String getMethod() {
         return "SEARCH";
     }
    };

现在您可以使用 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>";

这不是特定的查询。我只是从另一个文档中替换它并删除了所有我不需要的东西。

我希望这对你有所帮助。关于提供 Thunderbird 约会/日历日期我什么也说不出来,因为这超出了我的知识范围。

最好的问候和晚安,

赛摩

于 2012-10-25T22:34:18.510 回答