J'ai trouvé plusieurs autres questions sur le SO concernant l'API JavaMail et l'envoi de courrier via un serveur SMTP, mais aucune d'entre elles ne traitait de la sécurité TLS. J'essaie d'utiliser JavaMail pour m'envoyer des mises à jour de statut via mon serveur de messagerie SMTP professionnel, mais cela nécessite TLS, et je ne trouve aucun exemple en ligne d'utilisation de JavaMail pour accéder à un serveur SMTP qui nécessite le cryptage TLS. Quelqu'un peut-il aider avec ceci?Utilisation de JavaMail avec TLS
Répondre
Nous avons actuellement un code de notification dans notre produit qui utilise TLS pour envoyer du courrier s'il est disponible.
Vous devrez définir les propriétés de Java Mail. Vous n'avez besoin que du protocole TLS, mais vous pouvez avoir besoin de SSL si votre serveur SMTP utilise le protocole 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");
Vous pouvez alors passer à un session JavaMail ou toute autre séance instantiateur comme Session.getDefaultInstance(props)
.
Bon après, la ligne
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
est obligatoire si le serveur SMTP utilise l'authentification SSL , comme le serveur SMTP GMail fait. Toutefois, si le serveur utilise l'authentification Plaintext sur TLS, il ne doit pas être présent car Java Mail se plaint que la connexion initiale est en texte brut.
Vérifiez également que vous utilisez la dernière version de Java Mail. Récemment, j'ai utilisé d'anciens jarres Java Mail d'un projet précédent et je n'ai pas pu faire fonctionner le code, car le processus de connexion échouait. Après avoir mis à jour vers la dernière version de Java Mail, la raison de l'erreur est devenue claire: c'était une javax.net.ssl.SSLHandshakeException, qui n'était pas lancée dans l'ancienne version de la lib.
Les paramètres de l'exemple ci-dessus ne fonctionnaient pas pour le serveur que j'utilisais (authsmtp.com). Je continuais à obtenir cette erreur:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
j'ai supprimé les paramètres mail.smtp.socketFactory et tout fonctionnait. Les paramètres définitifs étaient les suivants (l'authentification SMTP n'a pas été utilisée et j'ai défini le port ailleurs):
java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");
Utilisez simplement le code suivant. Il est vraiment utile d'envoyer des courriels via Java, et cela fonctionne:
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();
}
}
}
Avec Simple Java Mail 5.0.0 (simplejavamail.org), il est très simple et la bibliothèque se chargeront de toutes les propriétés de session pour vous.
Voici un exemple en utilisant les serveurs 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 vous avez connexion à deux facteurs est activée, vous devez générer un application specific password de votre compte Google.
- 1. IMAP + TLS/SSL avec synapse?
- 2. JavaMail ClassNotFound
- 3. Javamail, IMAP et Kerberos
- 4. JavaMail Question ou Bug?
- 5. erreur Connexion via javamail
- 6. TLS/SSL in .net
- 7. Doute dans le programme JavaMail
- 8. Les délais d'attente ne fonctionnent pas avec JavaMail 1.4
- 9. N'importe quel FTP OSS .Net (client) avec TLS et SSL?
- 10. Connexion TLS avec des délais (et quelques autres difficultés)
- 11. API JavaMail, Gmail-Auth et setFrom
- 12. Comment forcer Javamail à effacer son cache de messages?
- 13. javax.net.ssl.SSLException lors de l'envoi de courrier en utilisant JavaMail
- 14. Envoi de courrier avec une image intégrée à l'aide de javamail
- 15. Erreur LDAP dans Tomcat - confidentialité TLS requise
- 16. Ajout d'une couche TLS/SSL aux communications ..?
- 17. Bonne bibliothèque SMTP + SSL/TLS pour C?
- 18. Problème avec JavaMail et Exchange Server 2007 - Argument de commande BAD
- 19. Ligne de commande TFS et exception de sécurité SSL/TLS
- 20. Utilisation de Jython avec M2Eclipse
- 21. Utilisation de LinqToSql avec NLog
- 22. Utilisation de l'alias avec MySql
- 23. Utilisation de system.windows.forms avec XNA
- 24. Utilisation de IQueryable avec Linq
- 25. Utilisation de Linq avec WCF
- 26. Utilisation de jQuery avec HttpHandlers
- 27. Utilisation de SQLITE avec VB6
- 28. Utilisation de diffstat avec subversion?
- 29. Utilisation de nHibernate avec st_geometry
- 30. Utilisation de kaptcha avec JSF
Merci beaucoup! Littéralement tout ce que j'ai fait était d'ajouter la ligne props.put ("mail.smtp.starttls.enable", "true"); à mon code et ça a fonctionné parfaitement! – dancavallaro
Notez que l'usine de socket de réglage n'est pas nécessaire avec java.mail moderne: http://stackoverflow.com/questions/17581066/using-javamail-with-a-self-signed-certificate/17584714#17584714 – Vadzim