私のアプリケーションでは、サーバーに接続してユーザーを認証します。これはコードです:
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を減らすにはどうすればよいですか?
JavaMailの最新バージョンに(JavaMail 1.5に)変更することで問題を解決します。私はそこにそれについて書きます: http://openejb.979440.n4.nabble.com/Which-version-of-JavaMail-td4665285.html
助けてくれてありがとう、特にビル・シャノンに:)
ソケットI/Oタイムアウトも設定できますか。接続されているが、サーバーからのデータの読み取りに失敗した場合、待機し続けます。
prop.put("mail.smtp.timeout", 1000);
読み取りタイムアウトは、接続されているがサーバーからデータを読み取ることができないことを示します。
SSLを使用しているので、smtps
ではなくsmtp
名前空間を構成しようとすることができます。
prop.put("mail.smtps.timeout", 1000);
prop.put("mail.smtps.connectiontimeout", 1000);
ところで:プロパティのタイムアウト値は、int
だけでなくString
としても渡すことができます。 JavaMailはそれらを適切に処理します(少なくともv1.5 +)。
同じ問題がありました。整数の代わりに文字列を使用しました。
prop.put("mail.smtp.timeout", "1000");
prop.put("mail.smtp.connectiontimeout", "1000");
いいえ、値は整数1000ではなく文字列「1000」でなければならないからです