2010-01-12 5 views
16

Я делаю sendMailServlet с JavaMail. У меня есть javax.mail.AuthenticationFailedException на моем выходе. Кто-нибудь может помочь мне? Благодарю.Как решить проблему 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>"); 
    } 

Выход на 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

когда происходит исключение? Я не вижу его в ваших журналах. –

ответ

20

Вы должны реализовать пользовательский 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); 
    } 
} 

Теперь использовать его в Session

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

Также проверьте JavaMail FAQ

+0

Sweet, это работает для меня! – PapaFreud

+0

@ n002213f: Как использовать этот GMAILAuthenticator, когда я получаю сеанс из mailservice.xml из jndi-вызова (jboss). – Ashwin

+0

@Ashwin - взгляните на ответ на аналогичный вопрос http://stackoverflow.com/questions/3475971/configure-the-mail-service-xml-in-jboss-with-a-gmail-account – n002213f

2

я пропускал этот аутентификатор объект аргумент в строке ниже

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

Эта линия решить мою проблему теперь я могу отправить почту через мое приложение Java. Остальная часть кода проста, как указано выше.

0

Проблема заключается в том, что вы создаете объект transport и используете его метод connect для аутентификации. Но тогда вы используете метод static для отправки сообщения, которое игнорирует аутентификацию, выполняемую объектом.

Итак, вы должны либо использовать метод sendMessage(message, message.getAllRecipients()) на объекте, либо использовать аутентификатор, как предложено другими, чтобы получить авторизацию через сеанс.

Вот Java Mail FAQ, вы должны прочитать.

0

Просто хотел поделиться с вами:
Мне посчастливилось получить эту ошибку после смены машины Digital Ocean (IP-адрес). Очевидно, Gmail признал его взломанной атакой. Следуя их указаниям и утверждая новый IP-адрес, код возвращается и работает.

20

Hello Everyone Эта ошибка относится к безопасности Google ... Это может быть разрешено путем включения менее безопасного.

Перейти к этой ссылке: "https://www.google.com/settings/security/lesssecureapps" и сделать "TURN ON", а затем запустить приложение ur Для этого.

+0

Простой и чистый. +5 для отличной ссылки –

+2

О, tq :). Я так долго боролся за это. Это не должно случиться ни с одним. поэтому я сделал это Clean and Clear Phil C – UmaShankar

+0

Он работает для меня, но как заставить его работать, не позволяя менее безопасным приложениям использовать IMAP? – gouessej

Смежные вопросы