2016-11-26 1 views
2

Gmail의 메일 API에 사용자 이름과 비밀번호가 필요하므로 안드로이드 애플리케이션을 통해 메일을 보내려고합니다. 메일이 내 서버를 통해 전송되어야합니다. 내 데이터는 코드 자체에 있음)Java Tomcat 서버를 통해 메일 보내기

그러나이 오류는 socketTimeOutException입니다. 시간 제한을 늘릴 수는 있지만 응답을받을 때까지 아무 것도 할 수 없으며 25 초가 걸립니다. 그리고 보내는 기능을 스레드에 넣으면 메일을 전혀 보내지 않습니다.

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    JSONObject res = new JSONObject(); 
    try { 
     System.out.println("Post ForgotMypass"); 
     Mongo mongo = new Mongo(LogIn.host, 27017); 
     DB db = mongo.getDB("Users"); 
     DBCollection collection = db.getCollection("usersCollection"); 

     // get a myUser object and cheack for jobs 
     String json = request.getParameter("JSONObj"); 
     JSONParser jp = new JSONParser(); 
     JSONObject temp = (JSONObject) jp.parse(json); 

     String mail = (String) temp.get("mail"); 
     if (mail != null) { 
      BasicDBObject searchQuer = new BasicDBObject(); 
      searchQuer.put("Mail", mail); 
      DBObject Item = collection.findOne(searchQuer); 
      if (Item != null) { 

       JSONParser jp2 = new JSONParser(); 
       JSONObject Is = (JSONObject) jp2.parse(Item.toString()); 
       JSONObject I = (JSONObject) Is.get("_id"); 
       String id = (String) I.get("$oid"); 

       if (id != null) { 
        String Dmail = URLDecoder.decode(mail, "UTF-8"); 

        SendMailSSL.SendMail(Dmail, 4, id); 

        StringWriter out = new StringWriter(); 
        res.put("Status", "true"); 
        res.writeJSONString(out); 
        response.getOutputStream().println(out.toString()); 
        System.out.println("mail sent succesfully"); 
       } else { 
        StringWriter out = new StringWriter(); 
        res.put("Status", "falseNoMail"); 
        System.out.println("ver false no mail"); 
        res.writeJSONString(out); 
        response.getOutputStream().println(out.toString()); 
       } 
      } else { 
       StringWriter out = new StringWriter(); 
       res.put("Status", "ObjectdoesntExists"); 
       System.out.println("ver ObjectdoesntExists"); 
       res.writeJSONString(out); 
       response.getOutputStream().println(out.toString()); 
      } 
     } else {// id is null 
      StringWriter out = new StringWriter(); 
      res.put("Status", "falseIdNUll"); 
      System.out.println("ver falseIdNUll"); 

      res.writeJSONString(out); 
      response.getOutputStream().println(out.toString()); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     StringWriter out = new StringWriter(); 
     res.put("Status", "false"); 
     System.out.println("ver false"); 

     res.writeJSONString(out); 
     response.getOutputStream().println(out.toString()); 
    } 

} 

과 :

public static void SendMail(String to, int typeOfMessage, String UserID) { 
    Properties props = new Properties(); 
    props.put("mail.smtp.host", "smtp.gmail.com"); 
    props.put("mail.smtp.socketFactory.port", "465"); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.port", "465"); 

    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("username", "password"); 
     } 
    }); 

    try { 

     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress("adress")); 
     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 
     /* 
     * all the type of messages 
     */ 
     if (typeOfMessage == 1) { 
      message.setSubject("title"); 
      message.setText("text"); 
     }else if (typeOfMessage == 2){ 
      message.setSubject("title"); 
      message.setText("text"); 
     }else if (typeOfMessage == 3){ 
      message.setSubject("title"); 
      message.setText("text"); 
     }else if (typeOfMessage == 4){ 
      message.setSubject("title"); 
      message.setText("text"); 
     } 




     Transport.send(message); 

     System.out.println("Done"); 

    } catch (MessagingException e) { 
     throw new RuntimeException(e); 
    } 
} 

그래서, 누군가가 어떻게 문제를 방지 할 수있는 아이디어가있다

는 서버의 코드입니다. 더 구체적으로, 서버를 통해 메일을 보내고 있지만 이후에 나는 어떻게 든 안드로이드 클라이언트에게 응답을 보냈다. 그래서 그는 25 초 동안 기다릴 필요가 없다.

감사

답변

0

메인 스레드를 통해 보내는 앱 GUI를 차단하기 때문에, 별도의 스레드에서 요청을 보내야합니다 귀하의 안드로이드 응용 프로그램. Tomcat-Server는 기본적으로 다른 스레드에서 요청을 처리합니다. 따라서 요청 처리 내에서 별도의 스레드를 시작할 필요가 없습니다. 다음과 같이 새 스레드를 시작할 수 있습니다 (java.lang.Thread에 대한 문서 참조) :

Thread theThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // send the request to the tomcat server 
     } 
    }); 
    theThread.start(); 
+0

나는 그것을 시험해보고 감사합니다. – Lagistos