2010-01-02 35 views
28

Estoy tratando de usar javamail en una secuencia de comandos groovy para enviar un correo electrónico a través de gmail. Miré muchos lugares en línea y hasta ahora no he podido hacerlo funcionar. El error que estoy consiguiendo al ejecutar mi script es:Usando Javamail para conectarse al servidor smtp de Gmail ignora el puerto especificado e intenta usar 25

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?)) 

Parece estar tratando de usar el puerto 25 a pesar de que he especificado que debe utilizar el puerto 587. ¿Alguien sabe qué podría estar causando este problema , Utilicé telnet para conectarme al servidor smtp en el puerto 587, y thunderbird usa el puerto 587 con seguridad STARTTLS y puede enviar correos con éxito utilizando el servidor smtp. Esto me dice que no es un problema de conectividad o puerto bloqueado. Aquí está el código que estoy usando para tratar de enviar el correo electrónico:

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) 

Cualquier ayuda sería muy apreciada. ¡Gracias por adelantado!

-Bryan

Respuesta

28

En Java que haría algo similar a: protocolo

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

Nota '' SMTPS. También las propiedades de socketFactory ya no son necesarias en las JVM modernas, pero es posible que deba establecer 'mail.smtps.auth' y 'mail.smtps.starttls.enable' en 'true' para Gmail. 'mail.smtps.debug' podría ser útil también.

+4

¡Gracias que funcionó! Tenga en cuenta que el segundo parámetro para conectar() en un int, también tuve que cambiar el número de puerto a 465 porque es el puerto SSL, mientras que 587 es para TLS. ¡Gracias de nuevo! – Bryan

+0

Me alegro de que funcionó. Creo que también puede eliminar las propiedades de mail.smtp.socketFactory. *. – maximdim

+0

¡Es bueno encontrar esto! Sendgrid tiene un ejemplo de Java [aquí] (http://sendgrid.com/docs/Code_Examples/java.html) que usa Propiedades, y funciona bien si puede usar el puerto 25, pero si tiene que cambiar, falla. Mi ISP bloquea el puerto 25, por lo que el código estaba funcionando desde mi oficina, pero no desde mi hogar, y no pude entender por qué mi puerto seleccionado estaba siendo ignorado. –

15

Para aquellos que buscan una solución completa, tengo esta trabajando con el siguiente código basado en la respuesta 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(); 
+0

Esto es exactamente lo que estaba buscando. Gracias – Tomik

+0

Uno de los pocos códigos de ejemplo que funcionó para mí, ¡gracias! – Cookie

+0

puede ayone, por favor, busque mi pregunta similar a esta http: //stackoverflow.com/questions/14209284/could-not-connect-to-smtp-host-localhost-port-25 –

2

Tal vez útil para cualquier otra persona corriendo en este tema: Al configurar el puerto en las propiedades:

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

..segúrate de utilizar un objeto de cadena. Usar un objeto numérico (es decir, largo) hará que esta declaración aparentemente no tenga ningún efecto.

+0

Gracias! Ese fue mi problema! – migmig

Cuestiones relacionadas