使用IMAP将邮件从GMail传输到Java应用程序


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无关。还有另一种指定协议的方法吗?(我没有在JavaDoc for IMAP中看到它。)


1
如果你想使用JavaMail访问Gmail的线程您可能会感兴趣的code.google.com/p/java-gmail-imap
马克迈凯轮

2
这些基于IMAP的解决方案中的任何一种都可以工作,无需“允许安全性较低的应用程序”吗?
jordanpg

Answers:


70

使用imaps是一个很好的建议。所提供的答案均不适合我,因此我在Google上搜索了更多的答案,并发现了有效的方法。这是我的代码现在的样子。

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使我头晕。


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)


6

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

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


3

您只能使用SSL连接到GMail。设置以下属性将对您有所帮助。

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

我一般不建议使用此方法,因为它会将所有imap连接覆盖为imaps。有时候选择是一件好事,尤其是如果该程序仅用于连接到Gmail时。但是,如果您认为普通的IMAP是完全错误的,那么此方法是可以接受的。:-)
克里斯·杰斯特·杨

...用于连接到不止只是Gmail时,我的意思。:-P
克里斯·杰斯特·杨


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 =“昵称”,在商业帐户情况下使用USERNAME =“ employee@business.com”。

在传统情况下,如果您使用旧的JavaMail依赖关系,请不要忘记在此处降低帐户安全性:https : //www.google.com/settings/security/lesssecureapps

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

希望能帮助到你!

更进一步:


“旧的JavaMail依赖关系”是什么意思?我认为这与JavaMail版本无关,这是因为您使用的是IMAPS而不是OAUTH2。
jordanpg


1

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

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


0

您需要安装JSSE才能将SSL与Java结合使用


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.