使用IMAP将GMail中的邮件转化为Java应用程序

我想使用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中看到它。)

使用imaps是一个很好的build议。 所提供的答案都没有为我工作,所以我search了一些,发现了一些工作。 以下是我的代码现在的样子。

 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让我的头脑旋转。

在JavaMail中,您可以使用imaps作为URLscheme来使用SSL上的IMAP。 (有关更多详细信息,请参阅JavaMail分发版中的SSLNOTES.txt 。)例如, imaps://username%40gmail.com@imap.gmail.com/INBOX

同样,使用smtps通过Gmail发送电子邮件。 例如, smtps://username%40gmail.com@smtp.gmail.com/ 。 再次阅读SSLNOTES.txt获取更多细节。 希望它有帮助!

您需要为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 + SSL),因此注意它是“imaps”而不是“imap”

您只能使用SSL连接到GMail。 设置下面的属性会强制你。

 props.setProperty(“mail.imap.socketFactory.class”,“javax.net.ssl.SSLSocketFactory”);
 props.setProperty(“mail.imap.socketFactory.fallback”,“false”);

如果您想了解更多有关在Gmail中使用JavaMail的示例代码(例如将Gmail标签转换为IMAP文件夹名称或使用IMAP IDLE),请在SourceForge上查看我的程序GmailAssistant 。

检查http://g4j.sourceforge.net/ 。 有一个使用这个API构build的最小的Gmail客户端。

我用下面的属性来获得商店,它运作良好。

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

以下是我和我的团队工作,给了一个经典的账号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。

希望它有帮助!

进一步:

您需要安装JSSE才能在Java中使用SSL

 URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");