web-dev-qa-db-fra.com

L'utilisation de Javamail pour se connecter au serveur smtp Gmail ignore le port spécifié et essaie d'utiliser 25

J'essaie d'utiliser javamail dans un script groovy pour envoyer un e-mail via gmail. J'ai regardé de nombreux endroits en ligne et je n'ai pas pu le faire fonctionner jusqu'à présent. L'erreur que j'obtiens lors de l'exécution de mon script est:

DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to Host "smtp.gmail.com", port 25, isSSL false
Caught: javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP Host: smtp.gmail.com, port: 25 (javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?))

Il semble essayer d'utiliser le port 25 même si j'ai spécifié qu'il devrait utiliser le port 587. Est-ce que quelqu'un sait ce qui pourrait causer ce problème, j'ai utilisé telnet pour me connecter au serveur smtp sur le port 587 et Thunderbird utilise port 587 avec sécurité STARTTLS et est capable d'envoyer avec succès du courrier à l'aide du serveur smtp. Cela me dit que ce n'est pas un problème de port ou de connectivité bloqué. Voici le code que j'utilise pour essayer d'envoyer l'e-mail:

import javax.mail.*
import javax.mail.internet.*

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('[email protected]', 'password');
    }
}

def  d_email = "[email protected]",
        d_password = "password",
        d_Host = "smtp.gmail.com",
        d_port  = "587", //465,587
        m_to = "[email protected]",
        m_subject = "Testing",
        m_text = "This is a test."

def props = new Properties()
props.put("mail.smtp.user", d_email)
props.put("mail.smtp.Host", d_Host)
props.put("mail.smtp.port", d_port)
props.put("mail.smtp.starttls.enable","true")
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true")
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")

def auth = new SMTPAuthenticator()
def session = Session.getInstance(props, auth)
session.setDebug(true);

def msg = new MimeMessage(session)
msg.setText(m_text)
msg.setSubject(m_subject)
msg.setFrom(new InternetAddress(d_email))
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to))
Transport.send(msg)

Toute aide serait grandement appréciée. Merci d'avance!

-Bryan

31
Bryan

En Java vous feriez quelque chose de similaire à:

Transport transport = session.getTransport("smtps");
transport.connect (smtp_Host, smtp_port, smtp_username, smtp_password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();    

Notez le protocole "smtpS". De plus, les propriétés socketFactory ne sont plus nécessaires dans les machines virtuelles Java modernes, mais vous devrez peut-être définir "mail.smtps.auth" et "mail.smtps.starttls.enable" sur "true" pour Gmail. 'mail.smtps.debug' pourrait également être utile.

31
maximdim

Pour tous ceux qui recherchent une solution complète, je l'ai fait fonctionner avec le code suivant basé sur la réponse de maximdim:

import javax.mail.*
import javax.mail.internet.*

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('[email protected]', 'test1234');
    }
}

def  d_email = "[email protected]",
        d_uname = "email",
        d_password = "password",
        d_Host = "smtp.gmail.com",
        d_port  = "465", //465,587
        m_to = "[email protected]",
        m_subject = "Testing",
        m_text = "Hey, this is the testing email."

def props = new Properties()
props.put("mail.smtp.user", d_email)
props.put("mail.smtp.Host", d_Host)
props.put("mail.smtp.port", d_port)
props.put("mail.smtp.starttls.enable","true")
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "true")
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")

def auth = new SMTPAuthenticator()
def session = Session.getInstance(props, auth)
session.setDebug(true);

def msg = new MimeMessage(session)
msg.setText(m_text)
msg.setSubject(m_subject)
msg.setFrom(new InternetAddress(d_email))
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to))

Transport transport = session.getTransport("smtps");
transport.connect(d_Host, 465, d_uname, d_password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
17
Bryan

Peut-être utile pour toute autre personne rencontrant ce problème: lors de la définition du port sur les propriétés:

props.put("mail.smtp.port", smtpPort);

.. assurez-vous d'utiliser un objet chaîne. L'utilisation d'un objet numérique (c'est-à-dire Long) fera que cette déclaration n'aura apparemment aucun effet.

3
uncrase