JavaMail: a case of AuthenticationException.

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

你可能感兴趣的:(JavaMail: a case of AuthenticationException.)