潛魚在淵

          Concentrating on Architectures.

          posts - 77, comments - 309, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JavaMail: a case of AuthenticationException.

          Posted on 2008-09-19 01:34 非魚 閱讀(1327) 評論(2)  編輯  收藏 所屬分類: Java技術
          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 標簽: ,

          評論

          # re: JavaMail: a case of AuthenticationException.  回復  更多評論   

          2008-09-19 09:35 by 隔葉黃鶯
          是你的原創嗎?那要贊一個

          # re: JavaMail: a case of AuthenticationException.  回復  更多評論   

          2008-09-19 12:01 by 非魚
          @隔葉黃鶯
          Thank you for your appreciations.
          主站蜘蛛池模板: 收藏| 麻江县| 阳春市| 焦作市| 城步| 巩义市| 新宁县| 昌都县| 乌海市| 梧州市| 友谊县| 通海县| 东乡族自治县| 丹巴县| 丽水市| 乌兰浩特市| 沁水县| 桂阳县| 镇安县| 光泽县| 伊春市| 达州市| 葫芦岛市| 集安市| 汨罗市| 高雄市| 金门县| 宁波市| 南丹县| 荔波县| 德昌县| 武山县| 井陉县| 定西市| 济源市| 汉沽区| 山东省| 怀远县| 兖州市| 丰台区| 渑池县|