76

我想使用JavaMailIMAP从 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 似乎是多余的。还有另一种指定协议的方法吗?(我没有在IMAP的 JavaDoc 中看到它。)

4

10 回答 10

71

使用 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 让我头晕目眩。

于 2008-09-14T17:08:14.060 回答
8

您需要为 imap 使用以下属性:

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

注意它是“imap”,而不是“imap”,因为您使用的协议是 imaps (IMAP + SSL)

于 2012-03-27T10:50:59.127 回答
6

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

同样,用于smtps通过 Gmail 发送电子邮件。例如,smtps://username%40gmail.com@smtp.gmail.com/。再次阅读SSLNOTES.txt以获取更多详细信息。希望能帮助到你!

于 2008-09-14T07:30:37.443 回答
3

您必须仅使用 SSL 连接到 GMail。设置以下属性将为您强制执行。

props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback", "false");
于 2008-09-14T07:22:52.470 回答
3

以下是对我和我的团队有用的方法,给定一个经典帐户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"。

在经典案例中,不要忘记在此处降低帐户安全性:https: //www.google.com/settings/security/lesssecureapps

在这两种情况下,如果为帐户启用了IMAP,请检查 GMail设置 => 转发 POP / IMAP 。

希望能帮助到你!

更进一步:

于 2015-07-03T21:49:30.450 回答
2

If you'd like more sample code on using JavaMail with Gmail (e.g. converting Gmail labels to IMAP folder names, or using IMAP IDLE), do check out my program GmailAssistant on SourceForge.

于 2008-09-21T21:08:27.877 回答
1

检查http://g4j.sourceforge.net/。有一个使用此 API 构建的最小 gmail 客户端。

于 2008-09-16T06:09:39.603 回答
1

我使用以下属性来获取商店并且效果很好。

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

于 2010-03-05T09:27:56.647 回答
0

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

于 2010-10-17T07:53:40.990 回答
0
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
于 2008-11-04T02:37:14.930 回答