使用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://[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); }
我设置了超时值,这样就不会"永远"超时。另外,MyAuthenticator也具有用户名和密码,这似乎与URL无关。还有另一种指定协议的方法吗? (我没有在JavaDoc for IMAP中看到它。)
解决方案
回答
我们只需要使用SSL连接到GMail。设置以下属性将对我们有所帮助。
props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imap.socketFactory.fallback", "false");
回答
在JavaMail中,我们可以将imaps
用作URL方案,以在SSL上使用IMAP。 (有关更多详细信息,请参见JavaMail分发中的" SSLNOTES.txt"。)例如," imaps://username%[email protected]/INBOX"。
同样,使用smtps
通过Gmail发送电子邮件。例如smtps:// username%40gmail.com @ smtp.gmail.com /
。同样,请阅读SSLNOTES.txt以获得更多详细信息。希望能帮助到你!
回答
使用imaps是一个很好的建议。所提供的答案均不适合我,因此我在Google上搜索了更多的答案,并发现了有效的方法。这是我的代码现在的样子。
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); }
很好,因为它可以将冗余身份验证器从图片中删除。我很高兴这能奏效,因为SSLNOTES.txt使我头晕。
回答
检查http://g4j.sourceforge.net/。有使用此API构建的最小gmail客户端。
回答
如果我们想了解有关将JavaMail与Gmail结合使用的更多示例代码(例如,将Gmail标签转换为IMAP文件夹名称,或者使用IMAP IDLE),请在SourceForge上签出我的程序GmailAssistant。
回答
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
回答
我使用以下属性来获取商店,并且效果很好。
" mail.imaps.host":" imap.gmail.com" " mail.store.protocol":" imaps" " mail.imaps.port":" 993"
回答
我们需要安装JSSE才能将SSL与Java结合使用