我想使用JavaMail和IMAP从Java应用程序访问Gmail中的邮件。 为什么会收到SocketTimeoutException?
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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 for IMAP中看到它。)
使用imaps是一个很好的建议。所提供的答案均不适合我,因此我在Google上搜索了更多的答案,并发现了有效的方法。这是我的代码现在的样子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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使我头晕。
您需要对imaps使用以下属性:
1 2 3 4
| 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)
在JavaMail中,可以将imaps用作URL方案,以通过SSL使用IMAP。 (有关更多详细信息,请参见JavaMail发行版中的SSLNOTES.txt。)例如,imaps://username%40gmail.com@imap.gmail.com/INBOX。
同样,使用smtps通过Gmail发送电子邮件。例如smtps://username%40gmail.com@smtp.gmail.com/。同样,请阅读SSLNOTES.txt了解更多详细信息。希望能帮助到你!
您只能使用SSL连接到GMail。设置以下属性将对您有所帮助。
1 2
| props.setProperty("mail.imap.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback","false"); |
在给定经典帐户nickname@gmail.com和企业帐户employee@business.com的情况下,这对我和我的团队都是有效的:
1 2 3 4 5 6 7 8
| 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
在这两种情况下,如果为帐户启用了IMAP,请检查GMail设置=>转发POP / IMAP。
希望能帮助到你!
更进一步:
-
http://www.oracle.com/technetwork/java/javamail/faq/index.html#gmail
-
https://support.google.com/mail/accounts/answer/78754
如果您想了解更多有关将JavaMail与Gmail结合使用的示例代码(例如,将Gmail标签转换为IMAP文件夹名称,或使用IMAP IDLE),请在SourceForge上签出我的程序GmailAssistant。
我使用以下属性来获取商店,并且效果很好。
"mail.imaps.host" :"imap.gmail.com"
"mail.store.protocol" :"imaps"
"mail.imaps.port" :"993"
检查http://g4j.sourceforge.net/。使用此API构建的Gmail客户端数量最少。
您需要安装JSSE才能将SSL与Java结合使用
1
| URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX"); |