Prefacio
El código para enviar el correo electrónico se copió directamente de una solicitud anterior. El servicio de correo electrónico de Tencent que utilicé en el pasado no tiene problemas con la ejecución del programa. Más tarde, después de modificarlo al servicio de correo Office365 de Microsoft, encontré dos problemas.
Pregunta 1, Configuración de cifrado TLS
La información de excepción es la siguiente:
Excepción en el hilo "principal" com.sun.mail.smtp.smtpsendfailedException: 530 5.7.57 smtp; El cliente no se autenticó para enviar correo anónimo durante el correo de
Esto es más fácil de resolver. Después de encontrar información, agregue la siguiente configuración:
mail.smtp.starttls.enable = true
Pregunta 2: El protocolo rápido es nulo:
La información de excepción es la siguiente:
Excepción en el hilo "principal" javax.mail.nosuchprovidereRexception: Protocolo inválido: nulo en javax.mail.session.getProvider (session.java:449) en javax.mail.session.gettransport (session.Java:667) en javax.mail.session.gettransport (session.Java:68) a javax.mail.session.gettransport (session.java:634)
Este problema se encuentra solo después de implementar la aplicación en un entorno de producción. Después de la inspección, descubrí que el paquete JAR que llamé no era la versión que especifiqué en Maven. Más tarde se confirmó que el paquete JAR utilizado por la aplicación en conflicto con el paquete JAR utilizado por el contenedor (es decir, embarcadero). La versión JAR utilizada por el contenedor es más antigua, pero los frascos del contenedor se cargan de forma predeterminada. Hay dos formas de resolver este problema:
Reescribir código con frascos que dependen de contenedores;
Actualice el frasco del contenedor.
La segunda opción es algo peligrosa, así que use la primera opción, simplemente modifique una línea:
Transport Transport = session.getTransport ("SMTP");Este problema ocurrirá en Javax.Mail Versión 1.4. Más tarde, las versiones más altas utilizarán el protocolo SMTP para enviar correos electrónicos de forma predeterminada.
Programa modificado:
paquete com.zhyea.zyTools; import java.util.date; import java.util.properties; import javax.mail.message; import javax.mail.session; import javax.mail.transport; import javax.mail.internett.internetaddress; import javax.Mail.internernet.mimessage; Final String mail_smtp_host = "smtp.exmail.qqq.com"; Integer final estático privado Mail_Smtp_Port = 587; Private estático final Boolean boolean mail_smtp_auth = true; static final static private string mail_smtp_user = "[email protected]"; static final static private String mail_smtp_password = "Robinzhyea"; Propiedades estáticas privadas Props = New Properties (); static {props.put ("mail.smtp.host", mail_smtp_host); props.put ("mail.smtp.auth", mail_smtp_auth); props.put ("mail.smtp.user", mail_smtp_user); props.put ("mail.smtp.password", mail_smtp_password); props.put ("mail.smtp.starttls.enable", true); }/*** Enviar correo electrónico*/public static void send (string a, string title, string content) {try {session session = session.getInstance (props); // Cree una sesión de correo Mimemessage Message = new Mimemessage (session); // Crea un nuevo objeto de mensaje de correo. Message.setRecipient (Message.RecipientType.to, New Internetaddress (a)); // Establezca el destinatario y establezca su tipo de recepción en // Establecer el contenido del mensaje // Message.settext (MailContent); // Enviar texto de texto sin formato TODO Message.setSubject (título); // Establecer el título Message.SetContent (Content, "Text/Html; Charset = GBK"); // Enviar correo html, el estilo de contenido es más rico. SetsentDate (nueva fecha ()); // Establezca el tiempo de envío. transport.connect (mail_smtp_user, mail_smtp_password); transport.sendMessage (Message, Message.GetAllRecipients ()); // Enviar correo electrónico, el segundo parámetro es todo el destinatario direcciones Transport.Close (); } catch (Exception e) {E.PrintStackTrace (); }}} paquete com.zhyea.zytools; import java.util.date; import java.util.properties; import javax.mail.message; import javax.mail.session; import javax.mail.transport; import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; Public Class Mailsender {String final de la estática privada Mail_Smtp_Host = "smtp.exmail.qq.com"; Integer final estático privado Mail_Smtp_Port = 587; Private estático final Boolean boolean mail_smtp_auth = true; static final static private string mail_smtp_user = "[email protected]"; static final static private String mail_smtp_password = "Robinzhyea"; Propiedades estáticas privadas Props = New Properties (); static {props.put ("mail.smtp.host", mail_smtp_host); props.put ("mail.smtp.auth", mail_smtp_auth); props.put ("mail.smtp.user", mail_smtp_user); props.put ("mail.smtp.password", mail_smtp_password); props.put ("mail.smtp.starttls.enable", true); }/*** Enviar correo electrónico*/public static void send (string a, string title, string content) {try {session session = session.getInstance (props); // Cree una sesión de correo Mimemessage Message = new Mimemessage (session); // Crea un nuevo objeto de mensaje de correo. Message.setRecipient (Message.RecipientType.to, New Internetaddress (a)); // Establezca el destinatario y establezca su tipo de recepción en // Establecer el contenido del mensaje // Message.settext (MailContent); // Enviar texto de texto sin formato TODO Message.setSubject (título); // Establecer el título Message.SetContent (Content, "Text/Html; Charset = GBK"); // Enviar correo html, el estilo de contenido es más rico. SetsentDate (nueva fecha ()); // Establezca el tiempo de envío. transport.connect (mail_smtp_user, mail_smtp_password); transport.sendMessage (Message, Message.GetAllRecipients ()); // Enviar correo electrónico, el segundo parámetro es todo el destinatario direcciones Transport.Close (); } catch (Exception e) {E.PrintStackTrace (); }}}
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo sea útil para el estudio y el trabajo de todos.