Доступ к календарю адреса электронной почты пользователя с помощью Java

У меня есть требование. Мне нужно получить доступ к электронной почте пользователя, который находится в домене компании. Мне нужно получить календарь этого пользователя и опубликовать его в веб-приложении. Я устал от поиска любого API, который мог бы мне в этом помочь. Почтовый клиент, используемый компанией, - это Thunder Bird, поэтому, в частности, мне нужно получить доступ к календарю от Thunder Bird для этого конкретного пользователя. Может ли кто-нибудь сказать мне несколько предложений по этому поводу.


person Ravi.Kumar    schedule 09.04.2012    source источник


Ответы (1)


Кумар

Ваш вопрос очень неточный (что за сервер предоставляет электронные письма / календари? Есть ли домен LDAP? И так далее). Я полагаю, вы говорите о старом сервере Exchange из-за какого-то домена и WebDAV и проблем при поиске? Но я, возможно, смогу оказать вам хотя бы небольшую помощь, которая может привести вас к уже проторенным путям других кодеров, чтобы вы могли найти простое и быстрое решение.

Сегодня я закончил коннектор M $ Exchange 2003 в качестве пробного варианта. И я говорю вам, что мне было действительно тяжело, как студенту во время стажировки. Тем не менее, я исследовал, искал, опрашивал и раздражал других, чтобы получить подсказки для полезного API, но ни один из них не удовлетворил моих целей.

Одна небольшая структура, которую я нашел, которую приятно использовать, называется Sardine WebDAV Client for Java. Проект очень легкий, хотя было полезно получить представление о том, как работает WebDAV, даже благодаря источникам, которые вы всегда можете посмотреть.

Все остальные решения нацелены на множество различных библиотек MAPI CC ++ для Linux. Для меня это не было вариантом.

Итак, какие у меня были варианты? Нет прямого доступа к клиентскому серверу Exchange 2k3, но есть одна учетная запись электронной почты. Так что вы все можете меня простить, но я обнаружил, что гораздо проще сделать POST-запрос к серверу E2k3 через OWA, потому что он был активирован, чем пытаться использовать какие-то тяжелые способы доступа, поддерживаемые 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 г. Аутентификация на основе форм. Как видите, я взял из браузера ссылку, которая используется для связи с E2k. Следующий шаг простой - отправьте запрос и ждите ...

HttpResponse response = httpclient.execute(httpPost);

Если вы получите хороший ответ, вы можете отфильтровать идентификатор сеанса. Следующим шагом после успешного входа в систему является поиск встреч. Поэтому вам следует найти подходящий метод для работы с установленным соединением WebDAV, запросив у M $ некоторую информацию: Метод ПОИСКА

Затем вы читаете, на что он способен. Я использовал хорошо известную машину поиска и запросил Поиск в папках календаря с помощью 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);

Я знаю, что это не идеальное решение. Потому что было два обстоятельства, которые заставили меня задуматься. Во-первых: я получил идентификатор сеанса, но мне не нужно было повторно использовать его где-либо, пока я сохранял его в поле. А во-вторых: мне нужно было вызвать другого 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 я ничего не могу сказать, потому что это еще не мне известно.

С уважением и спокойной ночи,

Семо

person Semo    schedule 25.10.2012
comment
Спасибо. Я почти забыл оценить твою помощь. - person Ravi.Kumar; 13.08.2013