Pregunta

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 discutió el uso de la seguridad TLS. Estoy intentando usar JavaMail para enviarme actualizaciones de estado a través de mi servidor de correo SMTP del trabajo, 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 ayudar con esto?

¿Fue útil?

Solución

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

Necesitará establecer las propiedades de Java Mail. Solo necesita el TLS uno, 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");

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

Otros consejos

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 utiliza Autenticación de texto sin formato sobre TLS , no debería estar presente, ya que Java Mail se quejará de que la conexión inicial es de texto sin formato.

También asegúrate de estar usando la última versión de Java Mail. Recientemente utilicé algunos archivos jar antiguos de Java Mail 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 se incluyó en la versión anterior de la biblioteca.

La configuración del ejemplo anterior no funcionó 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 fue esta (la autenticación SMTP no se usó 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 un 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="your@gmail.com";
            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("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        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();
        }

    }

}

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 para ti.

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

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .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 desde tu cuenta de Google.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top