使用Java访问用户电子邮件地址的日历

时间:2012-04-09 11:33:17

标签: email calendar webdav thunderbird

我有一个要求。我需要访问公司特定域上的用户电子邮件。我需要获取该用户的日历并将其发布到Web应用程序。我很难找到任何可以帮助我做到这一点的API。公司使用的电子邮件客户端是Thunder Bird,因此,具体而言,我需要从特定用户的Thunder Bird访问日历。任何人都可以告诉我一些相关的建议。

1 个答案:

答案 0 :(得分:0)

库马尔

您的问题非常准确(提供电子邮件/日历的服务器是什么类型的?是否有LDAP域?等等)。我想你是在讨论一个旧的Exchange Server,因为有些Domain和WebDAV以及搜索时遇到的问题?但我可能会给你至少一些帮助,这可能会让你已经走过其他编码器的路径,这样你就可以找到一个简单而快速的解决方案。

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

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

所有其他解决方案针对Linux的许多不同的MAPI CC ++ Libs。那对我来说不是一个选择。

那么,我有什么选择?无法直接访问客户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。正如您所看到的,我从浏览器中抓取了Link,用于与E2k进行通信。下一步很简单 - 发送请求并等待......

HttpResponse response = httpclient.execute(httpPost);

如果您得到了良好的回复,那么您可以过滤掉会话ID。成功登录后的下一步是搜索约会。因此,您应该找到一个合适的方法来处理已建立的WebDAV连接,方法是向M $索取一些信息: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约会/日历日期我不能说什么,因为这还不为我所知。

祝你好运,晚安,

塞莫