2017-07-25 70 views
0

我正在嘗試使用java發送email。但我面對錯誤,如下面在java/servlet中發送郵件時出錯

javax.mail.AuthenticationFailedException:連接失敗,沒有密碼指定

爲什麼會出現這個錯誤,當我還通過了身份驗證正確的電子郵件ID和密碼?

這是我的代碼

import java.io.IOException; 
import java.net.PasswordAuthentication; 
import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* Servlet implementation class TestMail 
*/ 
@WebServlet("/TestMail") 
public class TestMail extends HttpServlet { 
    private static final long serialVersionUID = 1L; 


    public TestMail() { 
     super(); 

    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     todo(request,response); 

    } 


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     todo(request,response); 

    } 

    private void todo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     request.setCharacterEncoding("utf8"); 
     response.setCharacterEncoding("utf8"); 

     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.post","587"); 



     Session session = Session.getDefaultInstance(props, 
       new Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(
           "[email protected]", "testing123"); 
          } 
       }); 

     Message message=new MimeMessage(session); 
     try { 
      message.setFrom(new InternetAddress("[email protected]","hello")); 

     message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
     message.setSubject("Testing Email"); 
     message.setText("hello this is testing mail \n \n Congrets"); 
     Transport.send(message); 
     System.out.println("Mail Sent Successfully"); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

my error image

+0

這是一個常見的錯誤,正如[JavaMail FAQ](https://javaee.github.io/javamail/FAQ#commonmistakes)中所述。 –

+0

okk現在工作謝謝@ Bill Shannon –

回答

0

JavaMail的身份驗證在javax.mail包中找到,是從java.net類的同名不同。這兩者不共享相同的Authenticator,因爲JavaMail API可以與Java 1.1一起使用,而Java 1.1不具有java.net類型。

參見本: http://www.rgagnon.com/javadetails/java-0538.html

0

1)請使用正確的jar文件POP3電子郵件:

import java.util.Properties; 
    import javax.activation.*; 
    import javax.mail.*; 

2),然後建立您的留言:最後

Properties props = new Properties(); 

    props.put("mail.smtp.host",     <mail_server>); 
    props.put("mail.smtp.port",     <port>); 
    props.put("mail.smtp.user",     <user>); 
    props.put("mail.smtp.password",    <pw>); 
    props.put("mail.smtp.auth",     <logon>); 
    props.put("mail.from",      <from>); 

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

    try { 
     MimeMessage msg = new MimeMessage(session); 
     msg.setFrom(); 
     msg.setRecipients(Message.RecipientType.TO, <email_to>); 
     msg.setRecipients(Message.RecipientType.CC, <email_cc>); 
     msg.setRecipients(Message.RecipientType.BCC, <email_bcc>); 
     msg.setSubject(x_subject, Globals.q_UNICODE_MAIL); 
     msg.setSentDate(new Date()); 
     msg.setHeader("Disposition-Notification-To", x_from); 
    // 
    //<build your Multipart message> 
    // 

3)連接併發送:

 Transport transport = session.getTransport("smtp"); 
     if (<logon_required>) { 
      transport.connect(<mail_server>, <user>, <pw>); 
     } 
     transport.sendMessage(msg, msg.getAllRecipients());