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 と重複しているように見えます。プロトコルを指定する別の方法はありますか? ( IMAPの JavaDoc には表示されませんでした。)

4

10 に答える 10

71

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

これは、冗長な Authenticator を排除するので便利です。SSLNOTES.txt が私の頭を回転させるので、これがうまくいったことをうれしく思います。

于 2008-09-14T17:08:14.060 に答える
8

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 + SSL) であるため、「imap」ではなく「imaps」であることに注意してください。

于 2012-03-27T10:50:59.127 に答える
6

JavaMail では、imapsIMAP over SSL を使用するための URL スキームとして を使用できます。(詳細についてSSLNOTES.txtは、JavaMail ディストリビューションの を参照してください。) たとえば、imaps://username%40gmail.com@imap.gmail.com/INBOX.

同様に、smtpsGmail 経由でメールを送信するために使用します。例: smtps://username%40gmail.com@smtp.gmail.com/。詳細については、もう一度お読みSSLNOTES.txtください。それが役に立てば幸い!

于 2008-09-14T07:30:37.443 に答える
3

SSL のみを使用して GMail に接続する必要があります。次のプロパティを設定すると、それが強制されます。

props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback", "false");
于 2008-09-14T07:22:52.470 に答える
3

以下は、私のチームと私にとってうまくいった方法です。従来のアカウントの Nickel@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設定 => POP / IMAP の転送を確認してください。

それが役に立てば幸い!

さらに進むには:

于 2015-07-03T21:49:30.450 に答える
1

http://g4j.sourceforge.net/を確認してください。この API を使用して構築された最小限の Gmail クライアントがあります。

于 2008-09-16T06:09:39.603 に答える
0

Java で SSL を使用するには、JSSE をインストールする必要があります。

于 2010-10-17T07:53:40.990 に答える
0
URLName server = new URLName("imaps://<gmail-user-name>:<gmail-pass>@imap.gmail.com/INBOX");
于 2008-11-04T02:37:14.930 に答える