пятница, октября 04, 2013

JavaMail API. Получение почты Gmail.

Реализация от Sun Microsystems. Типичный forkflow:

0) Установка параметров подключения
1) Получение сессии
2) Получение объект хранилища  
3) Получиние объекта папки с входящими сообщениями
4) Поиск нужных сообщений
5) Разбор сообщения
6) Закрытие папки и хранилища.

Страница на сайте Oracle, посвященная JavaMail API находится здесь.



0) В параметрах указываются данные необходимые для подключения к почтовому серверу:

    Properties props = new Properties();

    props.put("mail.imaps.host", "imap.gmail.com");
    props.put("mail.imaps.port", "993");
    props.put("mail.imaps.user", "name@gmail.com");
    props.put("mail.store.protocol", "imaps");

Реализация от Sun поддерживает pop3, imap, smtp, а также их безопасных "братьев" pop3s, imaps, smtps.
Полный список параметров и их описание есть в javadoc.

1) Сообщения доступны только в рамках сессии. Для получение сессии нужны свойства, описанные в 0, а также объект Authenticator:

    private class GmailAuthenticator extends Authenticator {

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("name@gmail.com", "password");
        }
    }

Теперь можно открыть сессию:

    Session.getInstance(props, new GmailAuthenticator());

2) Объект Store хранит папки с сообщениями, получить его можно из сессии:

        Store store = session.getStore();

Но этого мало, нужно к нему подключиться:

       store.connect();

В этот момент происходит аутентификация на почтовом сервере.

3) Вся почта хранится в папках, Folder, которые в свою очередь хранятся в корневой папке.
Объект Store хранит ссылку на корневую папку. Для работы с папкой её нужно открыть.

    Folder defaultFolder = store.getDefaultFolder();

    Folder inbox = defaultFolder.getFolder("INBOX");
    inbox.open(Folder.READ_ONLY);

4) У папки есть метод search для поиска сообщений. На вход он принимает объекты классов реализующих абстрактный SearchTerm. Можно реализовать свой или воспользоваться теми, что входят в реализацию API:

    Message[] unread = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false));
    Message[] subjPatternMathed = inbox.search(new SubjectTerm("Реестр"), unread);

В данном примере я нашел все непрочитанные сообщения, а уже в них нашел сообщения с заголовком содержащим слово "Реестр".

5) Интерфейс Message, то есть всё, что можно сделать с сообщением описан в спецификации и javadoc.

6) После того, как над сообщениями была сделана работа у объектов Store и Session надо вызвать метод close(), так как эти объекты предоставляю доступ к ресурсам за пределами JVM. В противном случае они не будут собраны Garbage Collector'ом.

    inbox.close(false);
    store.close();

Комментариев нет:

Отправить комментарий