【问题标题】:Acessing calendar of user email address using Java使用 Java 访问用户电子邮件地址的日历
【发布时间】:2012-04-21 18:54:49
【问题描述】:

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

【问题讨论】:

    标签: email calendar webdav thunderbird


    【解决方案1】:

    库马尔

    您的问题非常不精确(提供电子邮件/日历的服务器是什么样的?是否有 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);
    

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

    然后,您了解它可以做什么。我继续使用著名的 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 约会/日历日期,我无法透露任何信息,因为这超出了我的知识范围。

    最好的问候和晚安,

    Semo

    【讨论】:

    • 谢谢。我差点忘了感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多