使用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");