2010-12-15 3 views
1

私のサイトはJSPページとサーブレットに基づいています。私はvps上でTomcat 6を実行します。JavaMailを使用して電子メールを送信すると、「接続が多すぎます」という理由で「Connection refused」と表示されます - なぜですか?

私は自分のサイトで電子メールを送信するためにJavaMailバージョン1.4を使用しています。

セッション中にいくつかのメールを送信できますが、今日は自分のサイトの投稿ページに空白のページがあります。だから私は、Tomcatのログを見て、ここで起こっているもの -

 
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) 

私はMY ISPプロバイダを通じて自分の電子メールを送信します。家でインターネットに使うものこれはではなく、私のVPSが動作するのと同じプロバイダです。

この問題は、私のISPプロバイダとその結末に設定されている結果か、これはサーブレットのコードと関係がありますか?

は、ログには「あまりにも多くの接続」と述べたので、これが私の最後に何かがある場合は、最初は、私は思ったんだけど、何かがあれば私はは()メソッドを呼び出す近い、サーブレットで(を閉じなければなりません何かに?)メールが送信された後?サーブレットからの抜粋を含める

編集ポストに...


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 

答えて

2

私はあなたがこのどこかのようなコードのブロックを持っていることを前提としています

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

あなたが呼んでいますメソッドを閉じますか?

また、この呼び出しの頻度はどのくらいですか。スパム防止を実践しているのはプロバイダだけかもしれません。

+0

トランスポートオブジェクトでclose()を呼び出すと、コードをチェックしただけです。実際には、電子メールを送信するために自分のサーブレットで使用するメソッドのスニペットを投稿します。たぶんあなたが私が見ていないことをキャッチするものがあります。私は元の質問にコードを追加します... – katura

+0

プロバイダが私を制限している場合、私はそれについても疑問に思いました。私が自分のサイトでテストしていたこの特定のプロセスでは、2つの電子メールが送信されます。自分自身に1人、顧客に1人。私が試したのは初めてでした。両方のメールが送信されました。 2回目は、1回目だけが行きました。それは間違っていました。 7分後、私は別のjsp/servletページから電子メールを送り、電子メールが通過しました。 – katura

+0

私は問題が解決されたと思います。私のサーブレットに2つの電子メールを送信するメソッドがあります。これに問題があるのは、2つの電子メールを送信していたために、トランスポートと2つの接続を確立したことです。接続要求ごとにTransportオブジェクトを閉じる必要がありました。私はいくつかのテストを行い、電子メールは正常に送信されています。だから問題は修正されました:)あなたの助けをありがとう。 – 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; 
    } 

} 
関連する問題