2009-01-04 21 views
38

Encontré varias otras preguntas sobre SO con respecto a la API de JavaMail y el envío de correo a través de un servidor SMTP, pero ninguna de ellas se discutió con la seguridad de TLS. Intento utilizar JavaMail para enviar actualizaciones de estado a mí mismo a través de mi servidor de correo SMTP, pero requiere TLS, y no puedo encontrar ningún ejemplo en línea sobre cómo usar JavaMail para acceder a un servidor SMTP que requiere cifrado TLS. ¿Alguien puede ayudarme con esto?Uso de JavaMail con TLS

Respuesta

54

En realidad, tenemos un código de notificación en nuestro producto que usa TLS para enviar correo si está disponible.

Tendrá que establecer las propiedades de Java Mail. Solo necesita el TLS, pero es posible que necesite SSL si su servidor SMTP usa SSL.

Properties props = new Properties(); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.auth", "true"); // If you need to authenticate 
// Use the following if you need SSL 
props.put("mail.smtp.socketFactory.port", d_port); 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 

A continuación, puede pasar esto a una Sesión JavaMail o cualquier otro instanciador sesión como Session.getDefaultInstance(props).

+2

¡Muchas gracias! Literalmente, todo lo que hice fue agregar la línea props.put ("mail.smtp.starttls.enable", "true"); a mi código y funcionó perfectamente! – dancavallaro

+1

Tenga en cuenta que no es necesario configurar el socket factory con el moderno java.mail: http://stackoverflow.com/questions/17581066/using-javamail-with-a-self-signed-certificate/17584714#17584714 – Vadzim

22

Buen post, la línea

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

es obligatorio si el servidor SMTP utiliza autenticación SSL, al igual que el servidor SMTP de Gmail hace. Sin embargo, si el servidor usa Autenticación de texto sin formato sobre TLS, no debería estar presente, porque Java Mail se quejará de que la conexión inicial sea texto sin formato.

También asegúrese de estar utilizando la última versión de Java Mail. Recientemente utilicé algunos archivos Java Mail antiguos de un proyecto anterior y no pude hacer que el código funcionara, porque el proceso de inicio de sesión estaba fallando. Después de actualizar a la última versión de Java Mail, el motivo del error quedó claro: era una javax.net.ssl.SSLHandshakeException, que no apareció en la versión anterior de la lib.

8

Las configuraciones del ejemplo anterior no funcionaron para el servidor que estaba usando (authsmtp.com). Seguí conseguir este error:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

me quita la configuración mail.smtp.socketFactory y todo funcionaba. La configuración final era esta (autenticación SMTP no se utilizó y configuré el puerto en otro lugar):

java.util.Properties props = new java.util.Properties(); 
props.put("mail.smtp.starttls.enable", "true"); 
6

Simplemente use el siguiente código. Es realmente útil para enviar correo electrónico a través de Java, y funciona:

import java.util.*; 
import javax.activation.CommandMap; 
import javax.activation.MailcapCommandMap; 
import javax.mail.*; 
import javax.mail.Provider; 
import javax.mail.internet.*; 

public class Main { 

    public static void main(String[] args) { 
      final String username="[email protected]"; 
      final String password="password"; 
      Properties prop=new Properties(); 
      prop.put("mail.smtp.auth", "true"); 
      prop.put("mail.smtp.host", "smtp.gmail.com"); 
      prop.put("mail.smtp.port", "587"); 
      prop.put("mail.smtp.starttls.enable", "true"); 

      Session session = Session.getDefaultInstance(prop, 
      new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 
      try { 
       String body="Dear Renish Khunt Welcome"; 
       String htmlBody = "<strong>This is an HTML Message</strong>"; 
       String textBody = "This is a Text Message."; 
     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress("[email protected]")); 
       message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
     message.setSubject("Testing Subject"); 
     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
     mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
     mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
     mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
     mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
     mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
     CommandMap.setDefaultCommandMap(mc); 
      message.setText(htmlBody); 
         message.setContent(textBody, "text/html"); 
      Transport.send(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
2

Con Simple Java Mail 5.0.0 (simplejavamail.org) es muy sencillo y la biblioteca se hará cargo de todas las propiedades de sesión para usted.

Aquí hay un ejemplo usando los servidores SMTP de Google:

Email email = EmailBuilder.startingBlank() 
     .from("lollypop", "[email protected]") 
     .to("C.Cane", "[email protected]") 
     .withSubject("hey") 
     .withPlainText("We should meet up!") 
     .withHTMLText("<b>We should meet up!</b>") 
     .buildEmail(); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL) 
     .buildMailer() 
     .sendMail(email); 

Si usted tiene de dos factores de inicio de sesión activa, es necesario generar un application specific password de su cuenta de Google.