Envío de correo electrónico a través del servidor smtp de gmail en JAVA

¿Cuál es el problema con este código? De alguna manera está entrando en un bucle infinito en la línea Transport.send(message); línea, sin mensaje de error, sin excepción, solo tal vez bucle infinito (no lo sé porque no espero más de 5-10 minutos)

 final String username = ""; final String password = ""; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "465"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("@gmail.com")); message.setSubject("Test Subject"); message.setText("Test"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); } 

Aquí estoy dando algunos cambios, que funcionan bien para mí:

 Session session = Session.getInstance(props,null); 

Crea una instancia del objeto de mensaje como lo hizo. Y finalmente:

 Transport transport = session.getTransport("smtp"); String mfrom = "yourGmailUsernameWithout@"// example laabidiraissi transport.connect("smtp.gmail.com", mfrom, "thepassword"); transport.sendMessage(message, message.getAllRecipients()); 

Editar, ¿podría darme un favor y copiar / pegar y probar este ejemplo y mostrar lo que muestra?

 package com.test; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import org.junit.Test; public class EmailService { @Test public void test(){ Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", true); // added this line props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.user", "username"); props.put("mail.smtp.password", "password"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", true); Session session = Session.getInstance(props,null); MimeMessage message = new MimeMessage(session); System.out.println("Port: "+session.getProperty("mail.smtp.port")); // Create the email addresses involved try { InternetAddress from = new InternetAddress("username"); message.setSubject("Yes we can"); message.setFrom(from); message.addRecipients(Message.RecipientType.TO, InternetAddress.parse("receivermail")); // Create a multi-part to combine the parts Multipart multipart = new MimeMultipart("alternative"); // Create your text message part BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("some text to send"); // Add the text part to the multipart multipart.addBodyPart(messageBodyPart); // Create the html part messageBodyPart = new MimeBodyPart(); String htmlMessage = "Our html text"; messageBodyPart.setContent(htmlMessage, "text/html"); // Add html part to multi part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message message.setContent(multipart); // Send message Transport transport = session.getTransport("smtp"); transport.connect("smtp.gmail.com", "username", "password"); System.out.println("Transport: "+transport.toString()); transport.sendMessage(message, message.getAllRecipients()); } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

De acuerdo. Es un poco más complejo de lo que pensé por primera vez … Para resumir lo que obtuve:

  • Hay un comando muy útil: session.setDebug(true); . Si establece esto como verdadero, cada proceso importante se debutará en la consola. Recomiendo usarlo
  • La segunda computadora solo podría funcionar con la opción segura, puede cambiarla con: Transport transport = session.getTransport("smtps"); más bien del smtp no seguro … El objeto JavaMail API Transport también se ocupará de los puertos (respectivamente smtp: 587, smtps: 465)
  • También puede usar el método estático de la clase Transport para enviar el mensaje y (guardarlo antes, el método de envío no estático no guardará el mensaje), pero esta vez necesita usar javax.mail.Authenticator en la creación de la sesión, Me gusta esto:

     Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("login", "password"); } 

    });

1.4.2 JavaMailApi tiene otra excepción que la versión 1.4.7 para este problema …

Si no lo usa, no puede autenticarse con el método estático. Si usa el método de instancia, puede hacerlo.

  • Una computadora tiene maven y obtuvo la versión 1.4.2 de la API de JavaMail. La segunda computadora tiene una biblioteca descargada, con la versión 1.4.7, que supongo que también estropea las cosas
  • First comp Netbeans, segundo comp Intellij … +1) Hay muchos códigos de ejemplo viejos y malos en Internet, lo que hace que sea más difícil usar esta API correctamente.

Tan desordenado, pero había algún concepto básico que debería enfocarse …

Podría reproducir el comportamiento descrito en su pregunta y solucionarlo.

El método de send se atasca en

 SMTPTransport(Service).connect(String, int, String, String) line: 308 

La conexión no funciona porque tiene el puerto incorrecto para el host smtp de gmail: 465

cámbielo a 587

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

y funcionará

Usar Simple Java Mail debería ser sencillo:

 Email email = new Email(); email.setFromAddress("lollypop", "lol.pop@somemail.com"); email.addRecipient("C.Cane", "candycane@candyshop.org", RecipientType.TO); email.setText("We should meet up!"); email.setTextHTML("We should meet up!"); email.setSubject("hey"); new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

Si tiene activado el inicio de sesión de dos factores, debe generar una contraseña específica de la aplicación de su cuenta de Google.