使用IMAP从GMail获取邮件到Java应用程序

时间:2008-09-14 07:11:32

标签: java gmail imap

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

10 个答案:

答案 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一起使用