web-dev-qa-db-fra.com

Pourquoi le délai de connexion JavaMail est trop long

Dans mon application, je me connecte au serveur pour authentifier les utilisateurs. Voici le code:

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

J'ai défini le délai d'expiration de la connexion sur 1000 ms = 1 s, mais il est ignoré. Quand je débogue et que je mets un mauvais nom d'utilisateur et mot de passe

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

pas après 1000 ms, mais après 5000 * 60 ms = 5 min

Qu'est-ce qui ne va pas ? Comment puis-je réduire le timeoute?

17
kuba44

Je résous mon problème en passant à la dernière version de JavaMail (vers JavaMail 1.5). J'écris là-dessus: http://openejb.979440.n4.nabble.com/Which-version-of-JavaMail-td4665285.html

merci à tous pour votre aide, spécialement à Bill Shannon :)

2
kuba44

Pouvez-vous également configurer le délai d'expiration des E/S de socket. Lorsqu'il est connecté mais n'a pas pu lire les données du serveur, il continue d'attendre.

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

Délai de lecture indique que vous êtes connecté mais pas en mesure de lire les données du serveur.

17
Shamim Ahmmed

Puisque vous utilisez SSL, vous pouvez essayer de configurer smtps namespace, pas smtp:

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

BTW: les valeurs de délai d'attente dans les propriétés peuvent être passées en tant que int, ainsi que String. JavaMail les traitera tous les deux correctement (au moins v1.5 +).

9
J. Snow

J'ai eu le même problème. Cela a fonctionné avec la chaîne au lieu de l'entier.

prop.put("mail.smtp.timeout", "1000");    
prop.put("mail.smtp.connectiontimeout", "1000");    
8
Barış Özdemir

Non, c'est juste parce que la valeur doit être une chaîne "1000" et non un entier 1000

5
robbyone