mail - envío de correos java
El uso de Javamail para conectarse al servidor smtp de Gmail ignora el puerto especificado e intenta usar 25 (3)
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 obtengo al ejecutar mi script es:
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 que estoy tratando de usar el puerto 25 aunque he especificado que debería usar el puerto 587. ¿Alguien sabe qué podría estar causando este problema? He usado telnet para conectarme al servidor smtp en el puerto 587, y Thunderbird usa puerto 587 con seguridad STARTTLS y puede enviar correo exitosamente usando 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
En Java harías algo similar a:
Transport transport = session.getTransport("smtps");
transport.connect (smtp_host, smtp_port, smtp_username, smtp_password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
Tenga en cuenta el protocolo ''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.
Para cualquiera que busque una solución completa, esto funciona 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();
Tal vez sea útil para cualquier otra persona que se encuentre con este problema: al configurar el puerto en las propiedades:
props.put("mail.smtp.port", smtpPort);
... asegúrese de usar un objeto de cadena. Usar un objeto numérico (es decir, largo) hará que esta declaración aparentemente no tenga ningún efecto.