Ich möchte mit JavaMail und IMAP von einer Java-Anwendung aus auf Nachrichten in Google Mail zugreifen . Warum erhalte ich eine SocketTimeoutException ?
Hier ist mein Code:
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);
}
Ich habe die Timeout-Werte so eingestellt, dass das Timeout nicht "ewig" dauert. Außerdem verfügt MyAuthenticator über den Benutzernamen und das Kennwort, die mit der URL überflüssig zu sein scheinen. Gibt es eine andere Möglichkeit, das Protokoll anzugeben? (Ich habe es im JavaDoc für IMAP nicht gesehen .)
java
gmail
jakarta-mail
imap
Dave
quelle
quelle
Antworten:
Die Verwendung von Imaps war ein großartiger Vorschlag. Keine der Antworten funktionierte nur für mich, also googelte ich noch etwas und fand etwas, das funktionierte. So sieht mein Code jetzt aus.
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); }
Das ist schön, weil es den redundanten Authenticator aus dem Bild nimmt. Ich bin froh, dass dies funktioniert hat, weil die SSLNOTES.txt mir den Kopf verdreht.
quelle
Sie müssen die folgenden Eigenschaften für Imaps verwenden:
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");
Beachten Sie, dass es sich um "imaps" und nicht um "imap" handelt, da das von Ihnen verwendete Protokoll imaps (IMAP + SSL) ist.
quelle
In JavaMail können Sie
imaps
IMAP über SSL als URL-Schema verwenden. (SSLNOTES.txt
Weitere Informationen finden Sie in Ihrer JavaMail-Distribution.) Zum Beispielimaps://username%[email protected]/INBOX
.Verwenden Sie
smtps
in ähnlicher Weise E-Mails über Google Mail. zB ,smtps://username%[email protected]/
. Lesen Sie noch einmalSSLNOTES.txt
für weitere Details. Ich hoffe es hilft!quelle
Sie müssen nur über SSL eine Verbindung zu GMail herstellen. Wenn Sie die folgenden Eigenschaften festlegen, wird dies für Sie erzwungen.
quelle
Wenn Sie mehr Beispielcode für die Verwendung von JavaMail mit Google Mail wünschen (z. B. das Konvertieren von Google Mail-Labels in IMAP-Ordnernamen oder die Verwendung von IMAP IDLE), lesen Sie mein Programm GmailAssistant auf SourceForge .
quelle
Folgendes hat für mein Team und mich unter Berücksichtigung eines klassischen Kontos mit dem Spitznamen @gmail.com und eines Geschäftskontos [email protected] funktioniert:
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");
mit USERNAME = "Spitzname" im klassischen Fall und USERNAME = "[email protected]" im Fall des Geschäftskontos.
Vergessen Sie im klassischen Fall und wenn Sie eine alte JavaMail-Abhängigkeit verwenden, die Kontosicherheit hier nicht zu verringern: https://www.google.com/settings/security/lesssecureapps
Überprüfen Sie in beiden Fällen unter GMail- Einstellungen => POP / IMAP weiterleiten, ob IMAP für das Konto aktiviert ist.
Ich hoffe es hilft!
Um weiter zu gehen:
quelle
Überprüfen Sie http://g4j.sourceforge.net/ . Mit dieser API wird ein minimaler Google Mail-Client erstellt.
quelle
Ich habe die folgenden Eigenschaften verwendet, um das Geschäft zu erhalten, und es funktioniert gut.
"mail.imaps.host" : "imap.gmail.com"
"mail.store.protocol" : "imaps"
"mail.imaps.port" : "993"
quelle
Sie müssen JSSE installiert haben, um SSL mit Java verwenden zu können
quelle
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
quelle