1

要件があります。会社固有のドメインにあるユーザーの電子メールにアクセスする必要があります。そのユーザーのカレンダーを取得して、Webアプリケーションに公開する必要があります。私はそれを行うのに役立つAPIを見つけるのに疲れています。会社で使用されているメールクライアントはThunderBirdなので、具体的には、その特定のユーザーのThunderBirdからカレンダーにアクセスする必要があります。誰かがこれについていくつかの提案を教えてもらえますか?

4

1 に答える 1

0

クマール

あなたの質問は非常に不正確です(サーバーはどのような種類の電子メール/カレンダーを提供していますか?LDAPドメインはありますか?など)。ドメインとWebDAVがあり、検索中に問題が発生したため、古いExchangeServerについて話していると思いますか。しかし、私はおそらくあなたに少なくとも少しの助けを与えることができます、それはあなたが他のコーダーのすでに踏みにじられた道にあなたを導くかもしれません、それであなたは簡単で速い解決策を見つけるかもしれません。

今日、私は概念実証としてM $Exchange2003コネクタを完成させました。インターンシップ中の学生としては本当に大変でした。それでも、有用なAPIのヒントを得るために、他の人を調査、検索、照会、およびイライラさせましたが、目的を達成したものはありませんでした。

私が見つけた使いやすい小さなフレームワークの1つは、 Sardine WebDAV ClientforJavaと呼ばれています。プロジェクトは非常に軽量ですが、WebDAVがどのように機能するかを理解することは役に立ちましたが、いつでも見ることができるソースがあるためです。

他のすべてのソリューションは、Linux用のさまざまなMAPICC++ライブラリを対象としています。それは私にとって選択肢ではありませんでした。

それで、私にはどのようなオプションがありましたか?顧客のExchange2k3サーバーに直接アクセスすることはできませんが、1つの電子メールアカウントにアクセスできます。ですから、皆さんは私を許してくれるかもしれませんが、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"));

フォームベースの認証を行う方法については、Exchange2003フォームベースの認証を参照してください。ご覧のとおり、E2kとの通信に使用されるリンクをブラウザーから取得しました。次のステップは簡単です-リクエストを送信して待つ...

HttpResponse response = httpclient.execute(httpPost);

見返りに良い応答が得られた場合は、セッションIDを除外できます。ログインに成功した後の次のステップは、予定を検索することです。したがって、M $に情報を要求することにより、確立されたWebDAV接続で作業するための適切な方法を見つける必要があります。検索方法

次に、それが何ができるかを読みます。よく知られているFind-Machineを使用して、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);

私はそれが完璧な解決策ではないことを知っています。私が不思議に思った2つの状況があったからです。まず、セッション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>";

これは特定のクエリではありません。別のドキュメントと入れ替えて、不要なものをすべて削除しました。

これが少しお役に立てば幸いです。サンダーバードアポイントメント/カレンダーの日付の提供については、まだ私の知識を超えているため、何も言えません。

よろしくお願いいたします。おやすみなさい。

セモ

于 2012-10-25T22:34:18.510 に答える