我想使用JavaMail和IMAP从Java应用程序访问GMail中的消息。为什么我得到 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 for IMAP中看到它。)
答案 0 :(得分:69)
使用imaps是一个很好的建议。提供的答案都没有为我工作,所以我搜索了一些,发现了一些有用的东西。以下是我的代码现在的样子。
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让我头晕目眩。
答案 1 :(得分:8)
您需要为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)
答案 2 :(得分:6)
在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
了解更多详情。希望它有所帮助!
答案 3 :(得分:3)
您必须仅使用SSL连接到GMail。设置以下属性将强制为您。
props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imap.socketFactory.fallback", "false");
答案 4 :(得分:2)
如果您想了解有关使用JavaMail和Gmail的更多示例代码(例如,将Gmail标签转换为IMAP文件夹名称或使用IMAP IDLE),请在GmailAssistant上查看我的计划SourceForge。< / p>
答案 5 :(得分:2)
以下是我和我的团队的工作原理,给出了一个经典帐户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 =“nickname”,在商业帐户案例中使用USERNAME =“employee@business.com”。
在经典案例中,如果您使用旧的JavaMail依赖项,请不要忘记在此处降低帐户安全性:https://www.google.com/settings/security/lesssecureapps
在这两种情况下,请检入GMail 设置=&gt;如果为帐户启用了IMAP,则转发POP / IMAP 。
希望它有所帮助!
更进一步:
答案 6 :(得分:1)
检查http://g4j.sourceforge.net/。有一个使用此API构建的最小gmail客户端。
答案 7 :(得分:1)
我使用以下属性来获取商店并且效果很好。
"mail.imaps.host" : "imap.gmail.com"
"mail.store.protocol" : "imaps"
"mail.imaps.port" : "993"
答案 8 :(得分:0)
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
答案 9 :(得分:0)
您需要安装JSSE才能将SSL与Java一起使用