java - 无法使用 IMAP 连接到 Gmail

标签 java gmail jakarta-mail imap gmail-imap

我有此代码可通过 IMAP 连接到 Gmail

public static Session getSessionGmail() throws GeneralSecurityException {
    final Properties props = new Properties();
    MailSSLSocketFactory sf = new MailSSLSocketFactory();
    sf.setTrustAllHosts(true);
    props.setProperty("mail.imap.host", "imap.gmail.com");
    props.setProperty("mail.imap.user", gmailUsername);
    props.setProperty("mail.imap.password", password);
    props.setProperty("mail.imap.port", "993");
    props.setProperty("mail.imap.auth", "true");
    props.setProperty("mail.imap.starttls.enable", "true");
    props.put("mail.imap.starttls.enable", "true");
    props.put("mail.imap.ssl.socketFactory", sf);

    Authenticator auth = new Authenticator() {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(gmailUsername, password);
        }
    };
    return Session.getDefaultInstance(props, auth);
}
public static Folder openFolder(Session session, String folder) throws MessagingException {
    Store store = session.getStore("imaps");
    store.connect(gmailUsername, password);
    Folder f = store.getFolder(folder);
    f.open(Folder.READ_ONLY);
    return f;
}

我总是遇到这个异常,指向 store.connect()

javax.mail.AuthenticationFailedException: failed to connect
at javax.mail.Service.connect(Service.java:332)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:196)

我查了Google的所有信息,如果我没猜错的话,IMAP的端口是993。用户名和密码绝对正确。我想我错过了一些东西,但我无法弄清楚。

任何帮助将不胜感激!

编辑

添加mail.debug后,我得到了这些日志,但我仍然停留在store.connect()

DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
...
DEBUG IMAPS: protocolConnect login, host=imap.gmail.com, user=louis.t@gmail.com, password=<non-null>
DEBUG IMAPS: AUTHENTICATE PLAIN command trace suppressed
DEBUG IMAPS: AUTHENTICATE PLAIN command result: A1 NO [ALERT] Please log in via your web browser:

它已登录,但仍停留在连接状态..

最佳答案

尝试这样(注意字符串中的 imaps)

    sf.setTrustAllHosts(true);
    props.setProperty("mail.imaps.host", "imap.gmail.com");
    props.setProperty("mail.imaps.user", gmailUsername);
    props.setProperty("mail.imaps.password", password);
    props.setProperty("mail.imaps.port", "993");
    props.setProperty("mail.imaps.auth", "true");
    props.setProperty("mail.debug", "true");

我遇到了“从不安全的设备连接”的错误 - 但在 gmail 设置中有一个已知的解决方法。

关于java - 无法使用 IMAP 连接到 Gmail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615522/

相关文章:

ios - 使用 UIPasteBoard 复制 HTML 并粘贴到 Gmail

java - 无法使用 Spring : javax. mail.FolderClosedException 读取电子邮件正文

java - Groovy Imap 访问

java - 从 Eclipse 在 Tomcat 中部署时更改 Web 应用程序中的文件夹名称

java - Play Framework 2.2 如何设置响应覆盖调用操作中的状态代码

java - 较小规模的 Java 分布式编程

javax.mail.MessagingException : Can't send command to SMTP host

java - 在 Java servlet 中实现基于 session 的安全性

css - Gmail 不允许在邮件中使用样式表

c# - 通过雅虎发送邮件时出错?