Utilizzando Javamail per connettersi a Gmail smtp server ignora specificato la porta e cerca di utilizzare 25

Sto cercando di utilizzare javamail in un groovy script per l’invio di una e-mail tramite gmail. Ho guardato molti posti online e sono stati in grado di farlo funzionare così lontano. L’errore che ricevo quando in esecuzione il mio 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?))

Sembra essere cercando di usare la porta 25, anche se ho specificato che si deve usare la porta 587. Qualcuno sa cosa potrebbe essere la causa di questo problema, ho usato telnet per connettersi al server smtp sulla porta 587, e thunderbird utilizza la porta 587 con STARTTLS di sicurezza ed è in grado di inviare posta tramite il server smtp. Questo mi dice che non è bloccata una porta o a un problema di connettività. Qui è il codice che sto usando per provare a inviare 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)

Qualsiasi aiuto sarebbe molto apprezzato. Grazie in anticipo!

-Bryan

InformationsquelleAutor Bryan | 2010-01-02

 

3 Replies
  1. 32

    In Java si potrebbe fare qualcosa di simile a:

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

    Nota ‘smtpS’ protocollo. Anche socketFactory proprietà non è più necessario moderna Jvm, ma potrebbe essere necessario impostare ‘di posta.smtps.auth’ e ‘posta.smtps.starttls.abilita’ a ‘true’ per Gmail. ‘mail.smtps.debug’ potrebbero essere utili.

    • Grazie a voi che ci hanno lavorato! Nota che il secondo parametro connect() in un int, anche io ho dovuto cambiare il numero di porta 465, perché è la porta SSL, mentre 587 è per TLS. Grazie ancora!
    • Contento che ha funzionato. Penso che si può cadere mail.smtp.socketFactory.* proprietà, come pure.
    • Bello trovare questo! Sendgrid ha una java esempio qui che utilizza le Proprietà, e funziona bene se si può usare la porta 25, ma se devi passare, non riesce. Il mio ISP blocca la porta 25, in modo che il codice è di lavoro da parte del mio ufficio, ma non a casa, e io non riuscivo a capire perché la mia porta è stato ignorato.
    • Grazie, che ha lavorato sulla porta 587 per android, ma con “smtp” invece di “smtps”. La statica di Trasporto.send() funziona anche, ma solo se un autenticatore di callback viene utilizzato in Sessione.getInstance().
  2. 17

    Per chi cerca una soluzione completa, ho ottenuto questo lavoro con il seguente codice basato su maximdim risposta:

    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();
    • Questo è esattamente quello che stavo cercando. Grazie
    • Uno dei pochi codici di esempio, là fuori, che ha funzionato per me, grazie!
    • possibile con ayone si prega di guardare in alto per la mia domanda simile a questa?stackoverflow.com/questions/14209284/…
  3. 3

    Forse utile per chiunque altro, di incorrere in questo problema: Quando si imposta la porta sulla proprietà:

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

    ..assicurarsi di utilizzare un oggetto string. Utilizzando un valore numerico (cioè Lungo) oggetto causa di questa dichiarazione apparentemente non hanno alcun effetto.

    • Grazie! Che era il mio problema!

Lascia un commento