API JavaMail - Servidores SMTP

SMTP es un acrónimo de Simple Mail Transfer Protocol. Es un estándar de Internet para la transmisión de correo electrónico (correo electrónico) a través de redes de Protocolo de Internet (IP). SMTP usa el puerto TCP 25. Las conexiones SMTP protegidas por SSL se conocen por la abreviatura SMTPS, aunque SMTPS no es un protocolo por derecho propio.

La API de JavaMail tiene paquete com.sun.mail.smtpque actúa como proveedor de protocolo SMTP para acceder a un servidor SMTP. La siguiente tabla enumera las clases incluidas en este paquete:

ClaseDescripción
SMTPMessageEsta clase es una especialización de la clase MimeMessage que le permite especificar varias opciones y parámetros SMTP que se utilizarán cuando este mensaje se envíe a través de SMTP.
SMTPSSLTransporteEsta clase implementa la clase abstracta Transporte utilizando SMTP sobre SSL para el envío y transporte de mensajes.
SMTPTransportEsta clase implementa la clase abstracta de transporte utilizando SMTP para el envío y transporte de mensajes.

La siguiente tabla enumera las excepciones lanzadas:

ExcepciónDescripción
SMTPAddressFailedExceptionEsta excepción se lanza cuando el mensaje no se puede enviar.
SMTPAddressSucceededExceptionEsta excepción está encadenada a una SendFailedException cuando la propiedad mail.smtp.reportsuccess es verdadera.
SMTPSenderFailedExceptionEsta excepción se lanza cuando el mensaje no se puede enviar.
SMTPSendFailedExceptionEsta excepción se lanza cuando el mensaje no se puede enviar. La excepción incluye la dirección del remitente, que el servidor de correo rechazó.

los com.sun.mail.smtpEl proveedor utiliza la autenticación SMTP opcionalmente. Para usar la autenticación SMTP, deberá configurar la propiedad mail.smtp.auth o proporcionar al Transporte SMTP un nombre de usuario y contraseña cuando se conecte al servidor SMTP. Puede hacer esto usando uno de los siguientes enfoques:

  • Proporcione un objeto Autenticador al crear su sesión de correo y proporcione la información de nombre de usuario y contraseña durante la devolución de llamada del Autenticador. La propiedad mail.smtp.user se puede configurar para proporcionar un nombre de usuario predeterminado para la devolución de llamada, pero la contraseña aún deberá proporcionarse explícitamente. Este enfoque le permite utilizar el método de envío de transporte estático para enviar mensajes. Por ejemplo:

  • Transport.send(message);
  • Llame al método de conexión de transporte explícitamente con argumentos de nombre de usuario y contraseña. Por ejemplo:

    Transport tr = session.getTransport("smtp");
    tr.connect(smtphost, username, password);
    msg.saveChanges();
    tr.sendMessage(msg, msg.getAllRecipients());
    tr.close();

El proveedor del protocolo SMTP admite las siguientes propiedades, que se pueden configurar en el objeto Sesión JavaMail. Las propiedades siempre se establecen como cadenas. Por ejemplo:

props.put("mail.smtp.port", "587");

Aquí el Type La columna describe cómo se interpreta la cadena.

NombreTipoDescripción
mail.smtp.userCuerdaNombre de usuario predeterminado para SMTP.
mail.smtp.hostCuerdaEl servidor SMTP al que conectarse.
mail.smtp.portEn tEl puerto del servidor SMTP al que conectarse, si el método connect () no especifica uno explícitamente. El valor predeterminado es 25.
mail.smtp.connectiontimeoutEn tValor de tiempo de espera de conexión de socket en milisegundos. El valor predeterminado es el tiempo de espera infinito.
mail.smtp.timeoutEn tValor de tiempo de espera de E / S del socket en milisegundos. El valor predeterminado es el tiempo de espera infinito.
mail.smtp.fromCuerdaDirección de correo electrónico que se utilizará para el comando SMTP MAIL. Esto establece la dirección de devolución del sobre. El valor predeterminado es msg.getFrom () o InternetAddress.getLocalAddress ().
mail.smtp.localhostCuerdaNombre de host local utilizado en el comando SMTP HELO o EHLO. El valor predeterminado es InetAddress.getLocalHost (). GetHostName (). Normalmente, no debería ser necesario configurarlo si su JDK y su servicio de nombres están configurados correctamente.
mail.smtp.localaddressCuerdaDirección local (nombre de host) a la que enlazar al crear el socket SMTP. Por defecto, la dirección elegida por la clase Socket. Normalmente no debería ser necesario configurarlo.
mail.smtp.localportEn tNúmero de puerto local al que enlazar al crear el socket SMTP. De forma predeterminada, el número de puerto elegido por la clase Socket.
mail.smtp.ehlobooleanoSi es falso, no intente iniciar sesión con el comando EHLO. Por defecto es verdadero.
mail.smtp.authbooleanoSi es verdadero, intente autenticar al usuario usando el comando AUTH. El valor predeterminado es falso.
mail.smtp.auth.mechanisms CuerdaSi está configurado, enumera los mecanismos de autenticación a considerar. Solo se utilizarán los mecanismos admitidos por el servidor y admitidos por la implementación actual. El valor predeterminado es "LOGIN PLAIN DIGEST-MD5 NTLM", que incluye todos los mecanismos de autenticación admitidos por la implementación actual.
mail.smtp.auth.login.disable booleanoSi es verdadero, evita el uso del comando AUTH LOGIN. El valor predeterminado es falso.
mail.smtp.auth.plain.disablebooleanoSi es verdadero, evita el uso del comando AUTH PLAIN. El valor predeterminado es falso.
mail.smtp.auth.digest-md5.disablebooleanoSi es verdadero, evita el uso del comando AUTH DIGEST-MD5. El valor predeterminado es falso.
mail.smtp.auth.ntlm.disablebooleanoSi es verdadero, evita el uso del comando AUTH NTLM. El valor predeterminado es falso.
mail.smtp.auth.ntlm.domainCuerdaEl dominio de autenticación NTLM.
mail.smtp.auth.ntlm.flagsEn tIndicadores específicos del protocolo NTLM.
mail.smtp.submitter CuerdaEl remitente que se utilizará en la etiqueta AUTH en el comando MAIL FROM. Normalmente lo utiliza un retransmisor de correo para transmitir información sobre el remitente original del mensaje.
mail.smtp.dsn.notify CuerdaLa opción NOTIFICAR al comando RCPT. O NUNCA, o alguna combinación de ÉXITO, FALLO y RETRASO (separados por comas).
mail.smtp.dsn.retCuerdaLa opción RET del comando MAIL. FULL o HDRS.
mail.smtp.sendpartialbooleanoSi se establece en verdadero, y un mensaje tiene algunas direcciones válidas y otras no válidas, envíe el mensaje de todos modos, informando el error parcial con una SendFailedException. Si se establece en falso (el valor predeterminado), el mensaje no se envía a ninguno de los destinatarios si hay una dirección de destinatario no válida.
mail.smtp.sasl.enablebooleanoSi se establece en verdadero, intente utilizar el paquete javax.security.sasl para elegir un mecanismo de autenticación para iniciar sesión. El valor predeterminado es falso.
mail.smtp.sasl.mechanismsCuerdaUna lista separada por espacios o comas de nombres de mecanismos SASL para intentar usar.
mail.smtp.sasl.authorizationid CuerdaEl ID de autorización que se utilizará en la autenticación SASL. Si no se configura, se utiliza el ID de autenticación (nombre de usuario).
mail.smtp.sasl.realmCuerdaEl reino a usar con la autenticación DIGEST-MD5.
mail.smtp.quitwait booleanoSi se establece en falso, se envía el comando QUIT y la conexión se cierra inmediatamente. Si se establece en verdadero (el valor predeterminado), hace que el transporte espere la respuesta al comando QUIT.
mail.smtp.reportsuccess booleanoSi se establece en verdadero, hace que el transporte incluya una excepción SMTPAddressSucceededException para cada dirección que tenga éxito.
mail.smtp.socketFactory Fábrica de enchufesSi se establece en una clase que implementa la interfaz javax.net.SocketFactory, esta clase se utilizará para crear sockets SMTP.
mail.smtp.socketFactory.classCuerdaSi se establece, especifica el nombre de una clase que implementa la interfaz javax.net.SocketFactory. Esta clase se utilizará para crear sockets SMTP.
mail.smtp.socketFactory.fallbackbooleanoSi se establece en true, si no se crea un socket usando la clase de fábrica de socket especificada, el socket se creará usando la clase java.net.Socket. Por defecto es verdadero.
mail.smtp.socketFactory.port En tEspecifica el puerto al que conectarse cuando se utiliza la fábrica de conectores especificada. Si no se configura, se utilizará el puerto predeterminado.
mail.smtp.ssl.enablebooleanoSi se establece en verdadero, use SSL para conectarse y use el puerto SSL de forma predeterminada. El valor predeterminado es falso para el protocolo "smtp" y verdadero para el protocolo "smtps".
mail.smtp.ssl.checkserveridentitybooleanoSi se establece en verdadero, verifica la identidad del servidor según lo especificado por RFC 2595. El valor predeterminado es falso.
mail.smtp.ssl.trust CuerdaSi se establece y no se ha especificado una fábrica de sockets, habilita el uso de MailSSLSocketFactory.
Si se establece en "*", todos los hosts son de confianza.
Si se establece en una lista de hosts separados por espacios en blanco, esos hosts son de confianza.
De lo contrario, la confianza depende del certificado que presente el servidor.
mail.smtp.ssl.socketFactory Fábrica de sockets SSLSi se establece en una clase que amplía la clase javax.net.ssl.SSLSocketFactory, esta clase se utilizará para crear sockets SSL SMTP.
mail.smtp.ssl.socketFactory.classCuerdaSi se establece, especifica el nombre de una clase que amplía la clase javax.net.ssl.SSLSocketFactory. Esta clase se utilizará para crear sockets SSL SMTP.
mail.smtp.ssl.socketFactory.portEn tEspecifica el puerto al que conectarse cuando se utiliza la fábrica de conectores especificada. Si no se configura, se utilizará el puerto predeterminado.
mail.smtp.ssl.protocols cuerdaEspecifica los protocolos SSL que se habilitarán para las conexiones SSL. El valor de la propiedad es una lista separada por espacios en blanco de tokens aceptables para el método javax.net.ssl.SSLSocket.setEnabledProtocols.
mail.smtp.starttls.enable booleanoSi es verdadero, habilita el uso del comando STARTTLS (si lo admite el servidor) para cambiar la conexión a una conexión protegida por TLS antes de emitir cualquier comando de inicio de sesión. El valor predeterminado es falso.
mail.smtp.starttls.requiredbooleanoSi es verdadero, requiere el uso del comando STARTTLS. Si el servidor no admite el comando STARTTLS o el comando falla, el método de conexión fallará. El valor predeterminado es falso.
mail.smtp.socks.hostcuerdaEspecifica el nombre de host de un servidor proxy SOCKS5 que se utilizará para las conexiones al servidor de correo.
mail.smtp.socks.port cuerdaEspecifica el número de puerto del servidor proxy SOCKS5. Esto solo debe usarse si el servidor proxy no está usando el número de puerto estándar de 1080.
mail.smtp.mailextensionCuerdaCadena de extensión para agregar al comando MAIL.
mail.smtp.usersetbooleanoSi se establece en verdadero, use el comando RSET en lugar del comando NOOP en el método isConnected. En algunos casos, sendmail responderá lentamente después de muchos comandos NOOP; el uso de RSET evita este problema de sendmail. El valor predeterminado es falso.

En general, las aplicaciones no deberían necesitar usar las clases en este paquete directamente. En su lugar, deberían utilizar las API definidas por el paquete javax.mail (y subpaquetes). Digamos, por ejemplo, que las aplicaciones nunca deberían construir instancias de SMTPTransport directamente. En su lugar, deben usar el método de sesión getTransport para adquirir un objeto de transporte apropiado.

En el capítulo Envío de correos electrónicos se muestran ejemplos para usar el servidor SMPT .