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

j'essaye d'utiliser javamail dans un script groovy pour envoyer un email via gmail. J'ai cherché beaucoup d'endroits en ligne et j'ai été incapable de le faire fonctionner jusqu'à présent. L'erreur que je reçois lors de l'exécution de mon script:

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 doit 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 le port 587 avec STARTTLS de sécurité et est capable d'envoyer des mails en utilisant le serveur smtp. Cela me dit que ce n'est pas un port bloqué ou problème de connectivité. Voici le code que j'utilise pour essayer d'envoyer l'email:

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

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('email@gmail.com', 'password');
    }
}

def  d_email = "email@gmail.com",
        d_password = "password",
        d_host = "smtp.gmail.com",
        d_port  = "587", //465,587
        m_to = "email@gmail.com",
        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 à l'avance!

-Bryan

29
demandé sur Bryan 2010-01-02 05:54:43

3 réponses

En Java que 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 JVM modernes, mais vous pourriez avoir besoin de définir 'mail.SMTP.auth " et " le courrier.SMTP.starttls.activer ' to 'true' pour Gmail. 'courrier.SMTP.debug " pourrait être utile aussi.

29
répondu maximdim 2010-01-02 04:11:53

Pour ceux qui recherchent une solution complète, j'ai eu ce travail avec le code suivant, basé sur maximdim de réponse:

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

private class SMTPAuthenticator extends Authenticator
{
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication('email@gmail.com', 'test1234');
    }
}

def  d_email = "email@gmail.com",
        d_uname = "email",
        d_password = "password",
        d_host = "smtp.gmail.com",
        d_port  = "465", //465,587
        m_to = "testepscript@gmail.com",
        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();
15
répondu Bryan 2010-01-02 05:12:39

peut-être utile pour n'importe qui d'autre courant dans 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 de type string. L'utilisation d'un objet numérique (c.-à-d. Long) rendra cet énoncé apparemment sans effet.

2
répondu uncrase 2015-09-08 20:01:34