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

时间:2020-03-05 18:52:55  来源:igfitidea点击:

我想使用JavaMail和IMAP从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://[email protected]:[email protected]");
    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中看到它。)

解决方案

回答

我们只需要使用SSL连接到GMail。设置以下属性将对我们有所帮助。

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

回答

在JavaMail中,我们可以将imaps用作URL方案,以在SSL上使用IMAP。 (有关更多详细信息,请参见JavaMail分发中的" SSLNOTES.txt"。)例如," imaps://username%[email protected]/INBOX"。

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

回答

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

很好,因为它可以将冗余身份验证器从图片中删除。我很高兴这能奏效,因为SSLNOTES.txt使我头晕。

回答

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

回答

如果我们想了解有关将JavaMail与Gmail结合使用的更多示例代码(例如,将Gmail标签转换为IMAP文件夹名称,或者使用IMAP IDLE),请在SourceForge上签出我的程序GmailAssistant。

回答

URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");

回答

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

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

回答

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