2010-12-15 89 views
1

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 

Répondre

2

Je suppose que vous avez un bloc de code comme celui-ci quelque part:

Transport transport = session.getTransport("smtp"); 
transport.connect(); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close(); 

appelez-vous le méthode proche?

Aussi, quelle est la fréquence des appels à cela? Il se peut que votre fournisseur pratique la prévention du spam. J'appelle close() sur l'objet de transport, je viens de vérifier mon code.

+0

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

+0

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

+0

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

0
/*SIMPLE EMAIL TO GMAIL OR YAHOO MAIL USING JAVA*/ 
import java.awt.HeadlessException; 
import java.util.Properties; 
import javax.mail.Address; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class JavaMail { 

    public static void main(String args[]) { 
     new JavaMail().email(); 
    } 

    public void email() { 
     String from = "[email protected]"; 
     String password = "your_secret_password"; 
     String to = "[email protected]"; 
     String subject = "email_subject"; 
     String msg = "email_message"; 
     Properties properties = System.getProperties(); 
     properties = setProp(from, to); 
     Session session = Session.getDefaultInstance(properties); 

     try { 
      Address address = new InternetAddress(to, "LovenishGoyal"); 
      MimeMessage message = new MimeMessage(session); 
      message.setFrom(address); 
      message.addRecipient(Message.RecipientType.TO, address); 
      message.setSubject(subject); 
      message.setText(msg); 
      message.saveChanges(); 
      Transport transport = session.getTransport(); 
      System.out.println("connecting..."); 
      transport.connect(from, password); 
      System.out.println("connected!"); 
      System.out.println("sending..."); 
      transport.sendMessage(message, message.getAllRecipients()); 
      transport.close(); 
      System.out.println("Sent message successfully...."); 

     } catch (Exception mex) { 
      mex.printStackTrace(); 
     } 

    } 

    private Properties setProp(String email, String targetEmail) { 
     Properties props = null; 
     try { 
      props = System.getProperties(); 
      if (email.contains(",") || targetEmail.contains(",")) { 
       System.out.println("Please send one email to one person at a time..."); 
      } else if (email.contains("@yahoo.com")) { 
       props.put("mail.smtp.host", "smtp.mail.yahoo.com"); 
       props.put("mail.smtp.socketFactory.port", "465"); 
       props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
       props.put("mail.smtp.host", "smtp.mail.yahoo.com"); 
       props.put("mail.smtp.auth", true); 
      } else if (email.contains("@gmail.com")) { 
       props.put("mail.smtp.host", "smtp.gmail.com"); 
       props.put("mail.smtp.socketFactory.port", "465"); 
       props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
       props.put("mail.smtp.auth", "true"); 
       props.put("mail.smtp.port", "465"); 
      } else { 
       System.out.println("Your Email Address is invalid\n or host not supported!"); 
      } 

     } catch (HeadlessException exp) { 
      System.out.println(exp); 
     } 
     return props; 
    } 

}