2010-01-12 50 views
16

Tôi đang thực hiện sendMailServlet với JavaMail. Tôi có javax.mail.AuthenticationFailedException trên đầu ra của tôi. Bất cứ ai có thể vui lòng giúp tôi ra? Cảm ơn. đangCách giải quyết vấn đề 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>"); 
    } 

Output trên 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

khi nào ngoại lệ xảy ra chính xác? Tôi không thể nhìn thấy nó trong nhật ký của bạn –

Trả lời

20

Bạn cần phải thực hiện một phong tục 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); 
    } 
} 

Bây giờ sử dụng nó trong các Session

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

Ngoài ra kiểm tra JavaMail FAQ

+0

Ngọt ngào, điều này phù hợp với tôi! – PapaFreud

+0

@ n002213f: Làm cách nào để sử dụng Trình xác thực GMAILAuthenticator này khi tôi nhận phiên từ mailservice.xml từ cuộc gọi jndi (jboss). – Ashwin

+0

@Ashwin - hãy xem câu trả lời cho một câu hỏi tương tự http://stackoverflow.com/questions/3475971/configure-the-mail-service-xml-in-jboss-with-a-gmail-account – n002213f

2

Tôi đã mất tích lập luận này đối tượng thực hiện chứng thực trong dòng dưới đây

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

Dòng này giải quyết vấn đề của tôi bây giờ tôi có thể gửi mail thông qua ứng dụng Java của tôi. Phần còn lại của mã đơn giản như trên.

0

Vấn đề là, bạn đang tạo đối tượng transport và sử dụng phương thức kết nối của nó để tự xác thực. Nhưng sau đó bạn sử dụng phương thức static để gửi thư bỏ qua xác thực được thực hiện bởi đối tượng.

Vì vậy, bạn nên sử dụng phương pháp sendMessage(message, message.getAllRecipients()) trên đối tượng hoặc sử dụng trình xác thực theo đề xuất của người khác để được ủy quyền thông qua phiên.

Đây là số Java Mail FAQ, bạn cần đọc.

0

Chỉ muốn chia sẻ với bạn:
Tôi đã xảy ra lỗi này sau khi thay đổi máy Digital Ocean (địa chỉ IP). Rõ ràng Gmail đã nhận ra nó là một cuộc tấn công hacking. Sau khi làm theo chỉ dẫn của họ và phê duyệt địa chỉ IP mới, mã đã hoạt động trở lại.

20

Xin chào mọi người Lỗi này là từ bảo mật của Google ... Điều này có thể được giải quyết bằng cách kích hoạt bảo mật kém hơn.

Đi tới liên kết này: "https://www.google.com/settings/security/lesssecureapps" và thực hiện "BẬT", sau đó ứng dụng ur chạy chắc chắn.

+0

Đơn giản và sạch sẽ. +5 cho liên kết lớn –

+2

Ồ, tq :). Tôi đã đấu tranh cho điều này trong rất nhiều thời gian. Điều này không nên xảy ra với bất kỳ Một. Vì vậy, tôi đã làm cho nó sạch sẽ và rõ ràng Phil C – UmaShankar

+0

Nó hoạt động cho tôi nhưng làm thế nào để làm cho nó hoạt động mà không cần phải cho phép các ứng dụng kém an toàn hơn để sử dụng IMAP? – gouessej

Các vấn đề liên quan