2012-04-09 103 views
1

我有一個要求。我需要訪問公司特定域中的用戶電子郵件。我需要獲取該用戶的日曆並將其發佈到Web應用程序。我很疲憊,發現任何可以幫助我做到的API。公司使用的電子郵件客戶端是Thunder Bird,因此,具體而言,我需要從Thunder Bird爲特定用戶訪問日曆。任何人都可以告訴我一些這方面的建議。使用Java處理用戶電子郵件地址的日曆

回答

0

庫馬爾

你提的問題是非常unprecise(什麼樣的是提供電子郵件/日曆服務器?是否有一個LDAP域?等等)。我想你是在談論一箇舊的Exchange Server,因爲一些域和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 Forms-Based Authentication。正如你所看到的,我從瀏覽器中抓取了用於與E2k通信的Link。下一步很簡單 - 發送請求,並等待...

HttpResponse response = httpclient.execute(httpPost); 

如果你得到的回報良好的反應,那麼你就可以過濾掉的會話ID。成功登錄後的下一步是搜索約會。因此,您應該通過向M $索取一些信息找到適當的方法來處理已建立的WebDAV連接:SEARCH Method

然後,您閱讀它可以執行的操作。我繼續使用着名的查找機器並詢問Searching Calendar Folders with 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>"; 

這不是特別的查詢。我只是從另一個文檔交替它,並刪除了我不需要的所有東西。

我希望這可以幫助你一點。關於提供Thunderbird預約/日曆日期我不能說任何東西,因爲這仍然超出我的知識範圍。

最好的問候,晚安,

色嫫

+1

感謝。我幾乎忘記感謝你的幫助。 – 2013-08-13 10:25:22