Получение почты из 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