Получение почты из GMail в приложение Java с использованием протокола IMAP

Я хочу получить доступ к сообщениям в GMail из приложения Java с помощью JavaMail и IMAP. Почему я получаю исключение SocketTimeoutException?

Вот мой код:

Properties props = System.getProperties();
props.setProperty("mail.imap.host", "imap.gmail.com");
props.setProperty("mail.imap.port", "993");
props.setProperty("mail.imap.connectiontimeout", "5000");
props.setProperty("mail.imap.timeout", "5000");

try {
    Session session = Session.getDefaultInstance(props, new MyAuthenticator());
    URLName urlName = new URLName("imap://[email protected]:[email protected]");
    Store store = session.getStore(urlName);
    if (!store.isConnected()) {
        store.connect();
    }
} catch (NoSuchProviderException e) {
    e.printStackTrace();
    System.exit(1);
} catch (MessagingException e) {
    e.printStackTrace();
    System.exit(2);
}

Я устанавливаю значения тайм-аута так, чтобы он не принимал "навсегда" до тайм-аута. Кроме того, MyAuthenticator также имеет имя пользователя и пароль, что кажется лишним с URL-адресом. Есть ли другой способ указать протокол? (Я не видел его в JavaDoc для IMAP.)

Ответ 1

Использование imaps было большим предложением. Ни один из ответов, предоставленных мне, просто работал у меня, поэтому я еще больше искал googled и нашел что-то, что сработало. Вот как выглядит мой код.

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
  Session session = Session.getDefaultInstance(props, null);
  Store store = session.getStore("imaps");
  store.connect("imap.gmail.com", "<username>@gmail.com", "<password>");
  ...
} catch (NoSuchProviderException e) {
  e.printStackTrace();
  System.exit(1);
} catch (MessagingException e) {
  e.printStackTrace();
  System.exit(2);
}

Это хорошо, потому что он берет избыточный Authenticator из изображения. Я рад, что это сработало, потому что SSLNOTES.txt заставляет мою голову вращаться.

Ответ 2

В JavaMail вы можете использовать imaps в качестве схемы URL для использования IMAP через SSL. (Подробнее см. SSLNOTES.txt в вашем дистрибутиве JavaMail.) Например, imaps://username%[email protected]/INBOX.

Аналогично, используйте smtps для отправки писем через Gmail. например, smtps://username%[email protected]/. Снова прочитайте SSLNOTES.txt для более подробной информации. Надеюсь, это поможет!

Ответ 3

Для imaps необходимо использовать следующие свойства:

props.setProperty("mail.imaps.host", "imap.gmail.com");
props.setProperty("mail.imaps.port", "993");
props.setProperty("mail.imaps.connectiontimeout", "5000");
props.setProperty("mail.imaps.timeout", "5000");

Отмечает, что это "imaps", а не "imap", так как протокол, который вы используете, - это imaps (IMAP + SSL)

Ответ 4

Вам нужно подключиться к GMail только с использованием SSL. Установка следующих свойств заставит это для вас.

props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback", "false");

Ответ 5

Если вы хотите использовать более образец кода при использовании JavaMail с Gmail (например, конвертирование меток Gmail в имена папок IMAP или использование IMAP IDLE), проверьте мою программу GmailAssistant на SourceForge.

Ответ 6

Отметьте http://g4j.sourceforge.net/. Существует минимальный клиент gmail, построенный с использованием этого API.

Ответ 7

Я использовал следующие свойства, чтобы получить хранилище, и он работает хорошо.

"mail.imaps.host" : "imap.gmail.com"
"mail.store.protocol" : "imaps"
"mail.imaps.port" : "993"

Ответ 8

Вот то, что работало для моей команды и я, учитывая классическую учетную запись [email protected] и бизнес-аккаунт [email protected]:

            final Properties properties = new Properties();
            properties.put("mail.imap.ssl.enable", "true");

            imapSession = Session.getInstance(properties, null);
            imapSession.setDebug(false);
            imapStore = imapSession.getStore("imap");

            imapStore.connect("imap.gmail.com", USERNAME, "password");

с USERNAME = "никнейм" в классическом случае, а USERNAME = "[email protected]" в деловом случае.

В классическом случае, если вы используете старую зависимость JavaMail, не забудьте опустить защиту учетной записи здесь: https://www.google.com/settings/security/lesssecureapps

В обоих случаях проверьте настройки GMail = > Пересылка POP/IMAP, если IMAP включен для учетной записи.

Надеюсь, что это поможет!

Далее:

Ответ 9

URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");

Ответ 10

Вам необходимо установить JSSE для использования SSL с Java