web-dev-qa-db-fra.com

envoi d'email avec ssl en utilisant javax.mail

je veux envoyer un email en utilisant gmail comme serveur smtp.

c'est mon code, et je ne le fais pas fonctionner ... après avoir exécuté testSettings (), j'obtiens la sortie de débogage, puis elle s'arrête. pas de timeout, pas d'erreur, rien ....

public void testSettings() {
    final String username = Settings.get("benutzername");
    final String password = Settings.get("passwort");

    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtps");

        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.socketFactory.port", Settings.get("port"));
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");

    props.put("mail.smtp.auth", "true");

    props.put("mail.smtp.Host", Settings.get("server"));
    props.put("mail.smtp.port", Settings.get("port"));
    props.put("mail.smtp.timeout", "10000");

    props.put("mail.smtp.ssl.checkserveridentity", "false");
    props.put("mail.smtp.ssl.trust", "*");
    props.put("mail.smtp.connectiontimeout", "10000");

    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.socketFactory.fallback", "false");
    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
    session.setDebug(true);
    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected]"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected]"));
        message.setSubject("Testing Subject");
        message.setText("test");
        Transport transport = session.getTransport("smtps");
        transport.send(message);
        // Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        // throw new RuntimeException(e);
    }
}


DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning     javax.mail.Provider[TRANSPORT,smtps,com.Sun.mail.smtp.SMTPSSLTransport,Oracle]
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.Sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to Host "smtp.gmail.com", port 587, isSSL false

L'erreur suivante se produit: http://pastie.org/private/rkoknss6ppiufjd9swqta

9
pila

Au lieu de

props.put ("mail.transport.protocol", "smtps");

Transport transport = session.getTransport ("smtps");

Utilisation

props.put ("mail.transport.protocol", "smtp");

Transport transport = session.getTransport ("smtp");

Utilisez smtp, pas smtps

J'ai utilisé JDK 8, Netbeans 8, JavaMail 1.5.2 et cet exemple fonctionne très bien:

public static void main(String[] args) {
    Properties props = new Properties();
    props.put("mail.smtp.Host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465"); 
    Session session = Session.getDefaultInstance(props,
        new javax.mail.Authenticator() {
                            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("[email protected]","password");
            }
        });

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected]"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected]"));
        message.setSubject("Testing Subject");
        message.setText("Test Mail");

        Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}

Si vous ne parvenez pas à vous connecter avec le port 465, essayez le port 587

20
Anar Orujov

De la lecture de ceci: http://www.Oracle.com/technetwork/Java/javamail/faq-135477.html#commonmistakes

L'utilisation de

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

et

props.put("mail.smtp.socketFactory.port", "465");

est un peu dépassé. Pour simplifier le code, utilisez:

properties.put("mail.smtp.port", "465");
properties.put("mail.smtp.ssl.enable", "true");
21
Hibbem

Si vous utilisez Windows et que vous avez un antivirus ou un pare-feu, désactivez-le et essayez.

1
Nick Vaculich

Mon problème était dans le nom de l'ordinateur, il contenait des symboles cyrilliques. Pour comprendre la raison de votre problème, ajoutez

props.put("mail.debug", "true");

Voir aussi le code de travail ici

0
Anton