2010-12-02 14 views
7

Deseo enviar miles de correos electrónicos diferentes a diferentes destinatarios y me gustaría abrir la conexión a mi SMTP y mantenerla. Espero que esto sea más rápido, luego vuelva a abrir la conexión para el correo ervy. Me gustaría utilizar Apache Commons Email para eso, pero podría recurrir a Java Mail API si es necesario.¿Cómo enviar múltiples correos electrónicos en una sola sesión?

En este momento I'am haciendo esto, lo que abre una cierra la conexión cada vez que:

HtmlEmail email = new HtmlEmail(); 
email.setHostName(server.getHostName()); 
email.setSmtpPort(server.getPort()); 
email.setAuthenticator(new DefaultAuthenticator(server.getUsername(), server.getPassword())); 
email.setTLS(true); 
email.setFrom("[email protected]"); 
email.addTo(to); 
email.setSubject(subject); 
email.setHtmlMsg(htmlMsg); 
email.send(); 
+1

mantener la sesión abierta y enviar 1000 correos electrónicos y ** finalmente ** cerrar la sesión. –

+0

¿Sabe si esto es posible con el correo electrónico de commons? –

+0

parece que no ... Uso JavaMail completo. –

Respuesta

18

Aquí está mi clase de prueba de rendimiento. Enviar los correos usando una conexión es 4 veces más rápido y luego volver a abrir la conexión cada vez (lo que sucede cuando usas el correo común). El rendimiento se puede impulsar aún más mediante el uso de varios hilos.

Properties properties = System.getProperties(); 
    properties.put("mail.smtp.host", server); 
    properties.put("mail.smtp.port", "" + port); 

    Session session = Session.getInstance(properties); 
    Transport transport = session.getTransport("smtp"); 

    transport.connect(server, username, password); 

    for (int i = 0; i < count; i++) { 

     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress(from)); 
     InternetAddress[] address = {new InternetAddress(to)}; 
     message.setRecipients(Message.RecipientType.TO, address); 

     message.setSubject(subject + "JavaMail API"); 
     message.setSentDate(new Date()); 

     setHTMLContent(message); 
     message.saveChanges(); 
     transport.sendMessage(message, address); 

    } 

    transport.close(); 
3

Usted puede utilizar el código anterior, pero añade lo siguiente para obtener la sesión subyacente

email.getMailSession(); 

Puede añadir propiedades electrónico java adicionales por

email.getMailSession().getProperties().put(<key>, <value>); 
Cuestiones relacionadas