Question

J'ai trouvé plusieurs questions sur le responsable de réseau concernant l'API JavaMail et l'envoi de courrier via un serveur SMTP, mais aucune d'entre elles n'a abordé 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 cela nécessite TLS. Je ne trouve aucun exemple en ligne sur la manière d'utiliser JavaMail pour accéder à un serveur SMTP qui requiert le cryptage TLS. Quelqu'un peut-il aider avec ceci?

Était-ce utile?

La solution

Nous avons effectivement dans notre produit un code de notification 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 TLS mais vous aurez peut-être besoin de SSL si votre serveur SMTP l’utilise.

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 tel que Session.getDefaultInstance (props) .

Autres conseils

Bon post, 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. Toutefois, si le serveur utilise Authentification en texte brut sur TLS , il ne devrait pas être présent, car Java Mail se plaindra de ce que la connexion initiale est en texte brut.

Assurez-vous également que vous utilisez la dernière version de Java Mail. Récemment, j'ai utilisé d'anciens jars Java Mail d'un projet précédent et je ne pouvais pas 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 n'était pas générée dans l'ancienne version de la bibliothèque.

Les paramètres de l'exemple ci-dessus ne fonctionnaient pas pour le serveur que j'utilisais ( authsmtp.com ). . J'ai continué à avoir 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 le port a été configuré 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="your@gmail.com";
            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("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        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), c'est très simple et la bibliothèque se chargera 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", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .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 depuis votre compte Google.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top