Получение почты из GMail в приложение Java с использованием IMAP - PullRequest
74 голосов
/ 14 сентября 2008

Я хочу получить доступ к сообщениям в 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://MYUSERNAME@gmail.com:MYPASSWORD@imap.gmail.com");
    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.)

Ответы [ 10 ]

69 голосов
/ 14 сентября 2008

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

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);
}

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

8 голосов
/ 27 марта 2012

Вам нужно использовать следующие свойства для изображений:

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)

6 голосов
/ 14 сентября 2008

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

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

3 голосов
/ 14 сентября 2008

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

props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback", "false");
2 голосов
/ 04 июля 2015

Вот что сработало для меня и моей команды, учитывая классическую учетную запись nickname@gmail.com и служебную учетную запись employee@business.com:

            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 = "employee@business.com" в случае бизнес-аккаунта.

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

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

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

Чтобы пойти дальше:

2 голосов
/ 22 сентября 2008

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

1 голос
/ 05 марта 2010

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

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

1 голос
/ 16 сентября 2008

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

0 голосов
/ 17 октября 2010

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

0 голосов
/ 04 ноября 2008
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...