web-dev-qa-db-fra.com

Utilisation de JavaMail avec TLS

J'ai trouvé plusieurs autres questions sur SO concernant l'API JavaMail et l'envoi de courrier via un serveur SMTP, mais aucune n'a discuté de l'utilisation 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 il nécessite TLS, et je ne trouve aucun exemple en ligne sur la façon d'utiliser JavaMail pour accéder à un serveur SMTP qui nécessite le cryptage TLS. Quelqu'un peut-il m'aider?

46
dancavallaro

Nous avons en fait 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 Java Mail. Vous n'avez besoin que de TLS mais vous pourriez avoir besoin de SSL si votre serveur SMTP utilise 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 ensuite le transmettre à une session JavaMail ou à tout autre instanciateur de session comme Session.getDefaultInstance(props).

61
Sarat

Bon poste, la ligne

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

est obligatoire si le serveur SMTP utilise Authentification SSL, comme le fait le serveur SMTP GMail. Cependant, si le serveur utilise Authentification Plaintext sur TLS, il ne devrait pas être présent, car Java Mail se plaindra de la connexion initiale en texte clair.

Assurez-vous également que vous utilisez la dernière version de Java Mail. Récemment, j'ai utilisé d'anciens pots 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 effectué la mise à niveau vers la dernière version de Java Mail, la raison de l'erreur est devenue claire: il s'agissait d'une exception javax.net.ssl.SSLHandshakeException, qui était pas jeté dans l'ancienne version de la lib.

24
jasonsmith

Les paramètres de l'exemple ci-dessus ne fonctionnaient pas pour le serveur que j'utilisais ( authsmtp.com ). J'ai continué à recevoir cette erreur:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

J'ai supprimé les paramètres mail.smtp.socketFactory et tout a fonctionné. Les paramètres finaux é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");
8
Brent Matzelle

Utilisez simplement le code suivant. Il est vraiment utile d'envoyer des e-mails 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();
        }

    }

}
6
Renish Khunt

Avec Simple Java Mail 5.0. (simplejavamail.org), c'est très simple et la bibliothèque s'occupera de toutes les propriétés de session pour vous.

Voici un exemple d'utilisation des 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 la connexion à deux facteurs est activée, vous devez générer un mot de passe spécifique à l'application à partir de votre compte Google.

2
Benny Bottema