Использование JavaMail для отправки электронной почты, получение «Отказ в соединении» из-за «слишком большого количества соединений» - почему? - PullRequest
1 голос
/ 15 декабря 2010

Мой сайт основан на страницах JSP и сервлетах.Я запускаю Tomcat 6 на своем vps.

Я использую 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)

Я отправляю свои электронные письма через МОЙ провайдера.Тот, который я использую для интернета дома.Это , а не тот же провайдер, на котором работает мой VPS.

Итак, является ли эта проблема результатом моего провайдера Интернет-услуг и того, что установлено на его конце, или это связано с моимкод в моем сервлете?

В журнале говорилось " слишком много подключений ", поэтому вначале мне интересно, если это что-то на моем конце, и если есть что-то, я должен был бы закрывать (в сервлете вызывать метод close () для чего-нибудь?) после отправки электронного письма?

Отредактировано сообщение, включающее фрагмент из сервлета ...


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 ]

2 голосов
/ 15 декабря 2010

Я предполагаю, что у вас есть где-то такой блок кода:

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

Вы вызываете метод close?

Кроме того, какова частота звонков на это? Возможно, ваш провайдер практикует предотвращение спама.

0 голосов
/ 31 марта 2015
/*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 = "your_email@domain.com";
        String password = "your_secret_password";
        String to = "email_to@domain.com";
        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;
    }

}
...