2010-01-12 49 views
16

Estoy haciendo un sendMailServlet con JavaMail. Tengo javax.mail.AuthenticationFailedException en mi salida. ¿Por favor, puede alguien ayudarme? Gracias. código¿Cómo resolver el problema javax.mail.AuthenticationFailedException?

sendMailServlet:

try { 
     String host = "smtp.gmail.com"; 
     String from = "[email protected]"; 
     String pass = "pass"; 
     Properties props = System.getProperties(); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.user", from); 
     props.put("mail.smtp.password", pass); 
     props.put("mail.smtp.port", "587"); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.debug", "true"); 

     Session session = Session.getDefaultInstance(props, null); 
     MimeMessage message = new MimeMessage(session); 
     Address fromAddress = new InternetAddress(from); 
     Address toAddress = new InternetAddress("[email protected]"); 

     message.setFrom(fromAddress); 
     message.setRecipient(Message.RecipientType.TO, toAddress); 

     message.setSubject("Testing JavaMail"); 
     message.setText("Welcome to JavaMail"); 
     Transport transport = session.getTransport("smtp"); 
     transport.connect(host, from, pass); 
     message.saveChanges(); 
     Transport.send(message); 
     transport.close(); 

    }catch(Exception ex){ 

     out.println("<html><head></head><body>"); 
     out.println("ERROR: " + ex); 
     out.println("</body></html>"); 
    } 

salida en GlassFish 2.1:

DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false 
220 mx.google.com ESMTP 36sm10907668yxh.13 
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587 
EHLO platform-4cfaca 
250-mx.google.com at your service, [203.126.159.130] 
250-SIZE 35651584 
250-8BITMIME 
250-STARTTLS 
250-ENHANCEDSTATUSCODES 
250 PIPELINING 
DEBUG SMTP: Found extension "SIZE", arg "35651584" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "STARTTLS", arg "" 
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
STARTTLS 
220 2.0.0 Ready to start TLS 
EHLO platform-4cfaca 
250-mx.google.com at your service, [203.126.159.130] 
250-SIZE 35651584 
250-8BITMIME 
250-AUTH LOGIN PLAIN 
250-ENHANCEDSTATUSCODES 
250 PIPELINING 
DEBUG SMTP: Found extension "SIZE", arg "35651584" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" 
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Attempt to authenticate 
AUTH LOGIN 
334 VXNlcm5hbWU6 
aWpveWNlbGVvbmdAZ21haWwuY29t 
334 UGFzc3dvcmQ6 
MTIzNDU2Nzhf 
235 2.7.0 Accepted 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
DEBUG SMTP: useEhlo true, useAuth true 
+0

¿Cuándo ocurre exactamente la excepción? No puedo verlo en tus registros –

Respuesta

20

Es necesario implementar una costumbre Authenticator

import javax.mail.Authenticator; 
import javax.mail.PasswordAuthentication; 


class GMailAuthenticator extends Authenticator { 
    String user; 
    String pw; 
    public GMailAuthenticator (String username, String password) 
    { 
     super(); 
     this.user = username; 
     this.pw = password; 
    } 
    public PasswordAuthentication getPasswordAuthentication() 
    { 
     return new PasswordAuthentication(user, pw); 
    } 
} 

Ahora utilizarlo en el Session

Session session = Session.getInstance(props, new GMailAuthenticator(username, password)); 

También puedes ver el JavaMail FAQ

+0

¡Dulce, esto funciona para mí! – PapaFreud

+0

@ n002213f: ¿Cómo uso este GMAILAuthenticator cuando obtengo la sesión de mailservice.xml desde una llamada jndi (jboss)? – Ashwin

+0

@Ashwin: eche un vistazo a la respuesta a una pregunta similar http://stackoverflow.com/questions/3475971/configure-the-mail-service-xml-in-jboss-with-a-gmail-account – n002213f

2

me faltaba este argumento objeto autenticador en el debajo de la línea

Session session = Session.getInstance(props, new GMailAuthenticator(username, password)); 

Esta línea solucionado mi problema ahora puedo enviar correo a través de mi aplicación Java. El resto del código es simple al igual que arriba.

0

El problema es que está creando un objeto transport y está utilizando su método de conexión para autenticarse. Pero luego usa un método static para enviar el mensaje que ignora la autenticación realizada por el objeto.

Por lo tanto, debe utilizar el método sendMessage(message, message.getAllRecipients()) en el objeto o utilizar un autenticador como lo sugirieron otros para obtener la autorización de durante la sesión.

Aquí está el Java Mail FAQ, necesita leer.

0

Sólo quería compartir con usted:
Ocurrió este error después de cambiar la máquina Digital Ocean (dirección IP). Aparentemente Gmail lo reconoció como un ataque de pirateo. Después de seguir sus instrucciones y aprobar la nueva dirección IP, el código vuelve a estar en funcionamiento.

20

Hola a todos Este error es de seguridad de google ... Esto se puede resolver habilitando menos seguro.

Ir a este enlace: "https://www.google.com/settings/security/lesssecureapps" y hacer "ENCENDER", entonces tu aplicación se ejecuta para seguro.

+0

Simple y limpio. +5 para el gran enlace –

+2

Oh, tq :). He luchado por esto durante tanto tiempo. Esto no debería sucederle a nadie. entonces, lo hice limpio y claro Phil C – UmaShankar

+0

Funciona para mí, pero ¿cómo hacerlo funcionar sin tener que permitir que las aplicaciones menos seguras utilicen IMAP? – gouessej

Cuestiones relacionadas