web-dev-qa-db-ja.com

JavaMail接続タイムアウトが長すぎる理由

私のアプリケーションでは、サーバーに接続してユーザーを認証します。これはコードです:

try {
        Properties prop = new Properties();
        prop.put("mail.smtp.starttls.enable","true");
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.connectiontimeout", 1000);


        Session session = Session.getInstance(prop, null);
        Transport transport = session.getTransport("smtp");
        transport.connect("mion.elka.pw.edu.pl", 587, registerLog, registerPass);
        transport.close();
        return true;
    } catch (NoSuchProviderException ex) {
        Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } catch(AuthenticationFailedException ex) {
        Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    } catch (MessagingException ex) {
        Logger.getLogger(RegisterController.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    }

接続タイムアウトを1000ミリ秒= 1秒に設定しましたが、無視されます。デバッグして間違ったユーザー名とパスワードを設定すると、キャッチされます

javax.mail.MessagingException: Java.net.SocketTimeoutException: Read timed out

1000ミリ秒後ではなく、5000 * 60ミリ秒後= 5分

なにが問題ですか ? timeouteを減らすにはどうすればよいですか?

17
kuba44

JavaMailの最新バージョンに(JavaMail 1.5に)変更することで問題を解決します。私はそこにそれについて書きます: http://openejb.979440.n4.nabble.com/Which-version-of-JavaMail-td4665285.html

助けてくれてありがとう、特にビル・シャノンに:)

2
kuba44

ソケットI/Oタイムアウトも設定できますか。接続されているが、サーバーからのデータの読み取りに失敗した場合、待機し続けます。

prop.put("mail.smtp.timeout", 1000);

読み取りタイムアウトは、接続されているがサーバーからデータを読み取ることができないことを示します。

17
Shamim Ahmmed

SSLを使用しているので、smtpsではなくsmtp名前空間を構成しようとすることができます。

prop.put("mail.smtps.timeout", 1000);
prop.put("mail.smtps.connectiontimeout", 1000);

ところで:プロパティのタイムアウト値は、intだけでなくStringとしても渡すことができます。 JavaMailはそれらを適切に処理します(少なくともv1.5 +)。

9
J. Snow

同じ問題がありました。整数の代わりに文字列を使用しました。

prop.put("mail.smtp.timeout", "1000");    
prop.put("mail.smtp.connectiontimeout", "1000");    
8

いいえ、値は整数1000ではなく文字列「1000」でなければならないからです

5
robbyone