Several days ago I found that in a certain environment JavaMail may throw an AuthenticationException even you have set right user/password. Maybe this will not happen in a different mail server, but I'm not sure. So I just write it down and hope this can help someone who encounters such a problem.
Firstly I'd like to say the code is complied to specifications. The snippet: 
props = new Properties();
props.put( "mail.smtp.host", mailhost );
props.put( "mail.smtp.port", port );
props.put("mail.user", username);
props.put("mail.password", password);
props.put("mail.smtp.auth", "true");
javax.mail.Session session = javax.mail.Session.getInstance(props);
Message msg = new MimeMessage(session);
msg.setFrom( new InternetAddress(  from  ) ); // from is "user@localhost".
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse( recipient, false ) );
msg.setSubject( subject );
msg.setContent(text, "text/html");
msg.setSentDate(new Date());        
// send the thing off
Transport transport  = null;
try {
  PasswordAuthentication pa = new PasswordAuthentication((String)props.get("mail.user"), 
        (String)props.get("mail.password"));    
  transport = session.getTransport("smtp");    
  URLName urlname = transport.getURLName();
  session.setPasswordAuthentication(urlname, pa);
  if (!transport.isConnected()) {    
    transport.connect();        
  }
  Transport.send(msg);
} catch (MessagingException e) {    
  // TODO Auto-generated catch block    
  e.printStackTrace();    
  throw e;
} finally {    
  transport.close();
}
The code was tested ok in another program, and, use the same email server (Coremail). But whenever I debug this one, I got an AuthenticationException.
Nearly everything was the same to the another program, but of cause, actually not.
At last I opened the debug mode, like this:
javax.mail.Session session = javax.mail.Session.getInstance(props);
session.setDebug(true);
session.setDebugOut(System.out);
Then I found it out. 
msg.setFrom( new InternetAddress(  from  ) ); // from is "user@localhost".
The mail server not only need a user account and password, but also the right msg.setFrom().
After I set "from" to my real email address regarding to the mail server, everything went right.
And the conclusion is, as I guess, that some mail server would only accept an account in its system to send a mail. I dont know if this rule is suitable to all mail servers, because I have no chance to try others.
By Feelyou, under CC License.  Technorati 标签: 
JavaMail, 
AuthenticationException