tls mail example java smtp javamail ssl

example - Usando JavaMail con TLS



send mail smtp java (5)

Buena publicación, la línea

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

es obligatorio si el servidor SMTP usa autenticación SSL , como lo hace el servidor GMail SMTP. Sin embargo, si el servidor usa Autenticación de texto plano sobre TLS , no debería estar presente, ya que 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.

Encontré muchas 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 discutió el uso de 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?


Con Simple Java Mail 5.0.0 (simplejavamail.org) es muy sencillo y la biblioteca se encargará de todas las propiedades de la sesión por 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 tiene activado el inicio de sesión de dos factores, debe generar una contraseña específica de la aplicación de su cuenta de Google.


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

Deberá 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 de JavaMail o a cualquier otra sesión instanciadora como Session.getDefaultInstance(props) .


La configuración del ejemplo anterior no funcionaba para el servidor que estaba usando ( authsmtp.com ). Seguí recibiendo este error:

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

Eliminé la configuración de mail.smtp.socketFactory y todo funcionó. La configuración final era la siguiente (no se utilizó la autenticación SMTP y configuré el puerto en otro lugar):

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


Solo usa el siguiente código. Es realmente útil enviar correos electrónicos 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(); } } }