2008-12-22 34 views
18

Estoy tratando de usar Bill the Lizard's code para enviar un correo electrónico usando Google Apps. Estoy consiguiendo este error: Código dePrimero debe emitir un comando STARTTLS. Envío de correo electrónico con Java y Google Apps

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) 

de Bill contiene la línea siguiente, que parece estar relacionado con el error:

props.put("mail.smtp.starttls.enable","true"); 

Sin embargo, no ayuda.

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

Respuesta

4

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 del JavaMail FAQ on accessing Gmail. Tenga en cuenta que he omitido todos los controles de excepción 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(); 
} 
+0

tengo la n ext excepción al ejecutar su código: Excepción en el hilo "main" javax.mail.NoSuchProviderException: Sin proveedor para smtps –

+0

Parece que los archivos de recursos de JavaMail están perdidos o dañados (ver http://java.sun.com/products/javamail/ javadocs/javax/mail/Session.html). Hay copias predeterminadas de los archivos dentro de mail.jar/META-INF. –

+0

Gracias, lo resolví. –

16

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 funciona lugar SMTP

Transport transport = session.getTransport("smtps");    

Ahora Bill código del lagarto.

8

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!

14

Establezca 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"); 
+1

parece ser sensato, pero ¿por qué te metas con el puerto 25?en su mayoría siempre está bloqueado por los ISP y en realidad se reinicia a 465 varias líneas más tarde ... –

1

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 he actualizado a la nueva versión de JavaMail, el siguiente código trabajó para mí (se puede eliminar el comentario de las líneas de depuración para obtener información de depuración adicional - puerto fue 587 y el anfitrión 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(); 
    } 
} 
Cuestiones relacionadas