mail - Debe emitir un comando STARTTLS primero. Envío de correo electrónico con aplicaciones Java y Google
javamail driver (6)
Creo que tiene que ver con el uso de SMTPS en lugar de SMTP para el transporte de correo. Aquí hay una versión diferente, modelada después de las preguntas frecuentes de JavaMail sobre el acceso a Gmail . Tenga en cuenta que he omitido todos los controles de excepciones de niveles más finos para mayor claridad.
private static void send(
final String username,
final String password,
final String recipients,
final String subject,
final String body)
throws Exception
{
final Session session = Session.getInstance(System.getProperties(), null);
final Message msg = new MimeMessage(session);
final String senderEmail = username.contains("@") ? username : (username + "@gmail.com");
msg.setFrom(new InternetAddress(senderEmail));
final Address[] recipientAddresses = InternetAddress.parse(recipients);
msg.setRecipients(Message.RecipientType.TO, recipientAddresses);
msg.setSentDate(new Date());
msg.setSubject(subject);
msg.setText(body);
final Transport transport = session.getTransport("smtps");
transport.connect(GMAIL_SMTP_HOST, GMAIL_SMTP_PORT, username, password);
transport.sendMessage(msg, recipientAddresses);
transport.close();
}
Estoy tratando de usar el código de Bill the Lizard para enviar un correo electrónico usando Google Apps. Estoy recibiendo este error:
Exception in thread "main" javax.mail.SendFailedException: Sending failed;
nested exception is:
javax.mail.MessagingException: 530 5.7.0 Must issue a STARTTLS command first. f3sm9277120nfh.74
at javax.mail.Transport.send0(Transport.java:219)
at javax.mail.Transport.send(Transport.java:81)
at SendMailUsingAuthentication.postMail(SendMailUsingAuthentication.java:81)
at SendMailUsingAuthentication.main(SendMailUsingAuthentication.java:44)
El código de Bill contiene la siguiente línea, que parece relacionada con el error:
props.put("mail.smtp.starttls.enable","true");
Sin embargo, no ayuda.
Estas son mis declaraciones de importación:
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
¿Alguien sabe acerca de este error?
Encontré el problema. Anteriormente estaba usando j2ee.jar para importar javax.mail.
Eliminé j2ee.jar del classpath y descargué JavaMail 1.4.1 y puse en mi classpath dos jar, smtp.jar y mailapi.jar. Yo uso ahora smtps en lugar smtp
Transport transport = session.getTransport("smtps");
Ahora el código de Bill the Lizard funciona.
Es la versión de java mail API. Estaba enfrentando este problema y acabo de actualizar la API java mail a 1.4.3 ¡Funciona bien para mí!
¡Gracias!
Establece las siguientes etiquetas. Funcionará.
props.put("mail.smtp.user","username");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "25");
props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
Esto me estaba volviendo loco y solo quería agregar lo que funcionó para mí. Tuve que actualizar mi versión de JavaMail (1.4.5) para que esto funcione, no estoy seguro de qué versión estaba usando antes.
Una vez que actualicé a la nueva versión de JavaMail, el siguiente código funcionó para mí (puede descomentar las líneas de depuración para obtener información de depuración adicional - el puerto era 587
y el host era smtp.gmail.com
):
public void sendMailWithAuth(String host, String user, String password,
String port, List<String> toList, String htmlBody,
String subject) throws Exception {
Properties props = System.getProperties();
props.put("mail.smtp.user",user);
props.put("mail.smtp.password", password);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
//props.put("mail.debug", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.EnableSSL.enable","true");
Session session = Session.getInstance(props, null);
//session.setDebug(true);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
// To get the array of addresses
for (String to: toList) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
}
message.setSubject(subject);
message.setContent(htmlBody, "text/html");
Transport transport = session.getTransport("smtp");
try {
transport.connect(host, user, password);
transport.sendMessage(message, message.getAllRecipients());
} finally {
transport.close();
}
}
prueba esto:
enciéndalo: permita aplicaciones menos seguras para su cuenta de gmail