【问题标题】:Getting mail from GMail into Java application using IMAP使用 IMAP 从 GMail 获取邮件到 Java 应用程序
【发布时间】:2010-09-08 20:06:45
【问题描述】:

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

【问题讨论】:

标签: java gmail jakarta-mail imap


【解决方案1】:

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

props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imap.socketFactory.fallback", "false");

【讨论】:

  • 我一般不推荐这种方法,因为它会将 所有 imap 连接覆盖为 imap。有时选择是一件好事,特别是如果该程序仅用于连接到 Gmail。但是,如果您认为普通 IMAP 是完全错误的,那么这种方法是可以接受的。 :-)
  • ...用于连接到不仅仅是只是Gmail,我的意思是。 :-P
【解决方案2】:

在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】:

    使用 imap 是一个很好的建议。提供的答案都没有对我有用,所以我用谷歌搜索了一些,发现了一些有用的东西。这是我的代码现在的样子。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果您想要更多关于将 JavaMail 与 Gmail 结合使用的示例代码(例如,将 Gmail 标签转换为 IMAP 文件夹名称,或使用 IMAP IDLE),请查看我的程序 GmailAssistantSourceForge

        【讨论】:

          【解决方案6】:
          URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
          

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                您需要为 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)

                【讨论】:

                  【解决方案10】:

                  以下是对我和我的团队有用的方法,给定一个经典帐户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 Settings => Forwarding POP / IMAP

                  希望对你有帮助!

                  走得更远:

                  【讨论】:

                  • “旧的 JavaMail 依赖项”是什么意思?我认为这与 JavaMail 版本没有任何关系,而是您连接的是 IMAPS 而不是 OAUTH2。
                  猜你喜欢
                  • 2020-12-05
                  • 1970-01-01
                  • 2011-12-10
                  • 2012-04-24
                  • 1970-01-01
                  • 2021-01-09
                  • 2020-08-18
                  • 2018-11-02
                  • 2016-01-31
                  相关资源
                  最近更新 更多