使用 IMAP 将邮件从 GMail 接收到 Java 应用程序中

2022-08-31 13:13:25

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


答案 1

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

这很好,因为它将冗余的身份验证器从图片中移除。我很高兴这有效,因为SSLNOTES.txt让我头晕目眩。


答案 2

您需要对 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");

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


推荐