2009-01-04 9 views
38

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

54

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).

+2

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

+1

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

22

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.

8

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"); 
6

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(); 
     } 

    } 

} 
2

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.