潛魚在淵

          Concentrating on Architectures.

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

          JavaMail: a case of AuthenticationException.

          Posted on 2008-09-19 01:34 非魚 閱讀(1331) 評論(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.
          主站蜘蛛池模板: 马山县| 南丹县| 任丘市| 云梦县| 道孚县| 垫江县| 突泉县| 田林县| 赞皇县| 乡宁县| 古蔺县| 个旧市| 天全县| 古浪县| 大港区| 德惠市| 乌兰浩特市| 全南县| 公主岭市| 武宁县| 瑞安市| 花莲市| 出国| 隆安县| 溧阳市| 山阳县| 铜鼓县| 铜川市| 怀宁县| 平武县| 伊通| 沭阳县| 旬邑县| 延庆县| 芦溪县| 嘉祥县| 博白县| 绥江县| 稻城县| 织金县| 蕉岭县|