Mon site est basé sur des pages JSP et des servlets. Je cours Tomcat 6 sur mon VPS. J'utilise JavaMail version 1.4 pour envoyer des emails sur mon site.Utilisation de JavaMail pour envoyer des e-mails, obtention de "Connexion refusée" à cause de "trop de connexions" - pourquoi?
Je peux envoyer quelques courriels pendant ma session, mais aujourd'hui j'ai une page blanche sur la page de soumission de mon site. Alors j'ai regardé les journaux de Tomcat et voici ce qui est arrivé -
INFO | jvm 1 | 2010/12/15 10:29:13 | DEBUG: setDebug: JavaMail version 1.4.1 INFO | jvm 1 | 2010/12/15 10:29:13 | DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] INFO | jvm 1 | 2010/12/15 10:29:13 | DEBUG SMTP: useEhlo true, useAuth true INFO | jvm 1 | 2010/12/15 10:29:13 | DEBUG SMTP: trying to connect to host "smtp.myisprovider.net", port 25, isSSL false INFO | jvm 1 | 2010/12/15 10:29:14 | 421 4.7.1 - Connection Refused - - Too many connections INFO | jvm 1 | 2010/12/15 10:29:14 | DEBUG SMTP: could not connect to host "smtp.myisprovider.net", port: 25, response: 421 INFO | jvm 1 | 2010/12/15 10:29:14 | INFO | jvm 1 | 2010/12/15 10:29:14 | javax.mail.MessagingException: Could not connect to SMTP host: smtp.myisprovider.net, port: 25, response: 421 INFO | jvm 1 | 2010/12/15 10:29:14 | at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1379) INFO | jvm 1 | 2010/12/15 10:29:14 | at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) INFO | jvm 1 | 2010/12/15 10:29:14 | at javax.mail.Service.connect(Service.java:288) INFO | jvm 1 | 2010/12/15 10:29:14 | at javax.mail.Service.connect(Service.java:169) INFO | jvm 1 | 2010/12/15 10:29:14 | at spyder.servlets.email.MessageCenterServlet.cancelService(MessageCenterServlet.java:836) INFO | jvm 1 | 2010/12/15 10:29:14 | at spyder.servlets.email.MessageCenterServlet.doPost(MessageCenterServlet.java:172) INFO | jvm 1 | 2010/12/15 10:29:14 | at spyder.servlets.email.MessageCenterServlet.doGet(MessageCenterServlet.java:39) INFO | jvm 1 | 2010/12/15 10:29:14 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) INFO | jvm 1 | 2010/12/15 10:29:14 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896) INFO | jvm 1 | 2010/12/15 10:29:14 | at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) INFO | jvm 1 | 2010/12/15 10:29:14 | at java.lang.Thread.run(Thread.java:595)
-je envoyer mes e-mails par MON fournisseur de services Internet. Celui que j'utilise pour internet à la maison. C'est pas le même fournisseur que mon VPS fonctionne.
Est-ce que ce problème est dû à mon fournisseur de services Internet et à tout ce qui est défini de leur côté, ou est-ce dû à mon code dans ma servlet?
Le journal dit « trop de connexions », donc au début, je me demande si cela est quelque chose sur ma fin, et s'il y a quelque chose que je devrais fermer (dans le servlet, appelez la méthode() sur quelque chose?) après que l'email est envoyé?
Message modifié pour inclure extrait de servlet ...
Transport t = null;
try {
//get email address to send
//this email to
rs = stmt.executeQuery("Select Tech_Support_Email,POP3,SMTP from sitewide_info");
String toName = "mywebsite.com";
String host_email_address = "";
String POP3 = "";
String SMTP = "";
if(rs.next()) {
host_email_address = rs.getString(1);
POP3 = rs.getString(2);
SMTP = rs.getString(3);
}
// Specify the SMTP Host
Properties props = new Properties();
//props.put(POP3, SMTP);
props.setProperty("mail.smtp.auth", "true");
props.put("mail.pop3.host", POP3);
props.put("mail.smtp.host", SMTP);
// Create a mail session
Session ssn = Session.getInstance(props, null);
ssn.setDebug(true);
//...
//query db for some information, that will be appended to email
//...
// set the from information
InternetAddress from = new InternetAddress(fromEmail, fromName);
// set the to information
InternetAddress to = new InternetAddress(host_email_address, toName);
// Create the message
Message msg = new MimeMessage(ssn);
msg.setFrom(from);
msg.addRecipient(Message.RecipientType.TO, to);
msg.addHeader("X-Priority", "1");
msg.setSubject(Subject);
msg.setContent(HtmlMessage, "text/html");
String protocol = "smtp";
t = ssn.getTransport(protocol);
t.connect(SMTP,username,password);
t.sendMessage(msg, msg.getAllRecipients());
res.sendRedirect(res.encodeRedirectURL("MyAccount.jsp?message=Email%20successfully%20sent."));
return;
}//try
catch (MessagingException mex) {
mex.printStackTrace();
}
catch(Exception e) {}
finally {
try {
t.close();
}
catch(Exception e) {}
}//finally
En fait, je vais poster un extrait d'une méthode que j'utilise dans l'une de mes servlets pour envoyer l'email. Peut-être qu'il y a quelque chose que vous allez attraper que je ne vois pas. Je vais ajouter le code à ma question originale ... – katura
Je me demandais à ce sujet aussi, si le fournisseur me limite. Pour ce processus particulier que je testais sur mon site, 2 emails seront envoyés. 1 à moi-même, 1 au client. La première fois que je l'ai essayé, c'était réussi. Les deux e-mails ont été envoyés. La deuxième fois, seulement le 1er est allé, alors il s'est trompé. 7 minutes plus tard, j'ai envoyé un email via une autre page jsp/servlet, et l'email a traversé. – katura
Je pense que le problème a été résolu. Il y a une méthode dans mon servlet qui envoie 2 emails. Le problème avec ceci est que j'avais fait 2 connexions au Transport, l'une après l'autre, parce que j'avais 2 emails à envoyer. L'objet Transport devait être fermé après chaque demande de connexion. J'ai fait quelques tests, et les emails sont envoyés avec succès. Donc pour l'instant le problème a été corrigé :) Merci pour votre aide. – katura