Le code pour l'envoi de l'e-mail a été copié directement à partir d'une application précédente. Le service de messagerie Tencent que j'ai utilisé dans le passé n'a aucun problème avec l'exécution du programme. Plus tard, après l'avoir modifié au service de courrier Office365 de Microsoft, j'ai rencontré deux problèmes.
Question 1, Paramètres de chiffrement TLS
Les informations d'exception sont les suivantes:
La copie de code est la suivante:
Exception dans le thread "Main" com.sun.mail.smtp.smtpsendFailedException: 530 5.7.57 SMTP; Le client n'a pas été authentifié pour envoyer un courrier anonyme pendant le courrier de
C'est plus facile à résoudre. Après avoir trouvé des informations, ajoutez la configuration suivante:
mail.smtp.starttls.enable = true
Question 2: Le protocole rapide est nul:
Les informations d'exception sont les suivantes:
Exception dans Thread "Main" javax.mail.nosuchproviderexception: protocole non valide: null
sur javax.mail.session.getprovider (session.java:449)
sur javax.mail.session.gettransport (session.java:667)
sur javax.mail.session.gettransport (session.java:648)
sur javax.mail.session.gettransport (session.java:634)
Ce problème n'est rencontré qu'après le déploiement de l'application dans un environnement de production. Après inspection, j'ai constaté que le package JAR que j'ai appelé n'était pas la version que j'ai spécifiée dans Maven. Plus tard, il a été confirmé que le package JAR utilisé par l'application était en conflit avec le package JAR utilisé par le conteneur (c'est-à-dire la jetée). La version pot utilisée par le conteneur est plus ancienne, mais les pots du conteneur sont chargés par défaut. Il existe deux façons de résoudre ce problème:
Le deuxième choix est quelque peu dangereux, alors utilisez la première option, modifiez simplement une ligne:
Transport transport = session.getTransport("smtp");
Ce problème se produira dans javax.mail version 1.4. Plus tard, les versions supérieures utiliseront le protocole SMTP pour envoyer des e-mails par défaut.
Programme modifié:
package com.zhyea.zytools; import java.util.date; import java.util.properties; Importer javax.mail.mesage; import javax.mail.sses; importer javax.mail.transport; import javax.mail.internet.internetAddress; import javax.mail.internet.mimeMessage; classe publique MailSender {chaîne finale statique privée Mail_smtp_host = "smtp.exmail.qq.com"; entier final statique privé Mail_smtp_port = 587; Private statique final booléen mail_smtp_auth = true; chaîne finale statique privée mail_smtp_user = "[email protected]"; chaîne finale statique privée mail_smtp_password = "Robinzhyea"; Propriétés statiques privées Props = nouvelles propriétés (); 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); } / ** * Envoyer un e-mail * / public static void send (String to, title de chaîne, contenu de la chaîne) {try {session session = session.getInstance (accessoires); // Créer un nouvel objet de message de session MimEMessage Message.SetFrom (new Internetddress (mail_smtp_password)) Message.SetReccipient (message.recipentType.to, new InternetAddress (TO)); // Définissez le destinataire et définissez son type de réception sur // Définir le contenu du message // message.seTTeTXt (MailContent); // Envoyer un e-mail de texte en clair TODO Message.SetSubject (Title); // Définissez le titre Message.SetContent (Content, "Text / Html; charSet = GBK"); // Envoi HTML Mail, le style de contenu est plus riche message.SentDate (new Date ()); // Définissez le message d'heure d'envoi.SaveChanges (); // Informations de messagerie de stockage // Envoyer un e-mail Transport = Session.getTransport ("SMTP"); transport.connect (mail_smtp_user, mail_smtp_password); Transport.SendMessage (message, message.getAllrecicipients ()); // Envoyer un e-mail, le deuxième paramètre est toutes les adresses du destinataire SET Transport.Close (); } catch (exception e) {e.printStackTrace (); }}}