2011-07-14 12 views
6

Actualmente estoy usando Commons Email para enviar mensajes de correo electrónico, pero no he podido encontrar la manera de compartir las conexiones smtp entre los correos electrónicos enviados. Tengo un código como el siguiente:Apache Commons Correo electrónico y reutilización de conexiones SMTP

Email email = new SimpleEmail(); 
    email.setFrom("[email protected]"); 
    email.addTo("[email protected]"); 
    email.setSubject("Hello Example"); 
    email.setMsg("Hello Example"); 
    email.setSmtpPort(25); 
    email.setHostName("localhost"); 
    email.send(); 

que es muy fácil de leer, pero es lento cuando hago una gran cantidad de mensajes, que creo que es la sobrecarga de volver a conectar para cada mensaje. Así que lo perfilé con el siguiente código y descubrí que el uso de la reutilización de Transport hace que las cosas sean tres veces más rápidas.

Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    Session mailSession = Session.getDefaultInstance(props, null); 
    Transport transport = mailSession.getTransport("smtp"); 
    transport.connect("localhost", 25, null, null); 

    MimeMessage message = new MimeMessage(mailSession); 
    message.setFrom(new InternetAddress("[email protected]")); 
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); 
    message.setSubject("Hello Example"); 
    message.setContent("Hello Example", "text/html; charset=ISO-8859-1"); 

    transport.sendMessage(message, message.getAllRecipients()); 

Entonces, me preguntaba si habría alguna forma de hacer que Commons Email reutilice una conexión SMTP para enviar múltiples correos electrónicos. Me gusta más la API de correo electrónico de Commons, pero el rendimiento es un poco doloroso.

Gracias, Ransom

Respuesta

3

me ocurrió la siguiente solución después de cavar en la propia fuente de bienes comunes. Esto debería funcionar, pero puede haber mejores soluciones que no conozco de

Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    Session mailSession = Session.getDefaultInstance(props, null); 
    Transport transport = mailSession.getTransport("smtp"); 
    transport.connect("localhost", 25, null, null); 

    Email email = new SimpleEmail(); 
    email.setFrom("[email protected]"); 
    email.addTo("[email protected]"); 
    email.setSubject("Hello Example"); 
    email.setMsg("Hello Example"); 
    email.setHostName("localhost"); // buildMimeMessage call below freaks out without this 

    // dug into the internals of commons email 
    // basically send() is buildMimeMessage() + Transport.send(message) 
    // so rather than using Transport, reuse the one that I already have 
    email.buildMimeMessage(); 
    Message m = email.getMimeMessage(); 
    transport.sendMessage(m, m.getAllRecipients()); 
1

¿No podríamos lograr esto más fácil de conseguir la sesión de correo desde el primer email usando getMailSession() y ponerlo a todos los mensajes posteriores utilizando setMailSession()?

No es 100% seguro de lo que el

Tenga en cuenta que la aprobación de un nombre de usuario y contraseña (en el caso de la autenticación de correo) creará una nueva sesión de correo con un DefaultAuthenticator. Esto es una convience pero puede venir inesperado. Si se utiliza autenticación de correo pero NO se proporciona ningún nombre de usuario y contraseña, la implementación asume que ha establecido un autenticador y utilizará la sesión de correo existente (como se esperaba).

del javadoc significa, sin embargo: -/ http://commons.apache.org/email/api-release/org/apache/commons/mail/Email.html#setMailSession%28javax.mail.Session%29

ver también: https://issues.apache.org/jira/browse/EMAIL-96

no está seguro de cómo continuar aquí ...

Cuestiones relacionadas