JavaMail не отвечает только при вызове из webapp

#spring #spring-mvc #jakarta-mail

#spring #spring-mvc #джакарта-почта

Вопрос:

У меня есть JavaMail, я могу отправлять электронные письма, и это работает без проблем. Обычно для установления соединения и отправки электронной почты требуется 2-3 секунды. Проблема в том, что когда я вызываю тот же метод, нажав кнопку отправки на странице .jsp, которая связана с контроллером с помощью @RequestMapping, электронное письмо вообще не отправляется, страница просто продолжает ждать завершения метода, но он никогда не завершается, это похоже на бесконечный цикл.

Я создал EmailUtil.java даже как поток и запустил его, но результаты были те же.

Вот код.

Я использую этот класс для отправки электронных писем:

 ''''
    public class EmailUtil {
    
    /**
     * Utility method to send simple HTML email
     * @param session
     * @param toEmail
     * @param subject
     * @param body
     */
    
    private static final String ABSOLUTE_PATH = "(path to my email and password - ignore this) -credentials.properties";
    
    public static void prepareEmail(Session session, String toEmail, String subject, String body){
        try
        {
            MimeMessage msg = new MimeMessage(session);
    
            //set message headers
            msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
    
            msg.addHeader("format", "flowed");
    
            msg.addHeader("Content-Transfer-Encoding", "8bit");
    
            msg.setFrom(new InternetAddress("no_reply@example.com", "NoReply-MVC"));
    
            msg.setReplyTo(InternetAddress.parse("no_reply@example.com", false));
    
            msg.setSubject(subject, "UTF-8");
    
            msg.setText(body, "UTF-8");
    
            msg.setSentDate(new Date());
    
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
    
            System.out.println("Message is ready");
    
            Transport.send(msg);
    
            System.out.println("EMail Sent Successfully!!");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    enter code here
    public static void sendEmail(String toEmail, String code){
    
     String email =  null; //requires valid gmail id
     String password = null;
    
     try{
         FileReader reader=new FileReader(ABSOLUTE_PATH);
    
         Properties p=new Properties();
    
         p.load(reader);
    
         email = p.getProperty("email");
    
         password = p.getProperty("password");
    
     }catch (IOException e){
         e.printStackTrace();
         System.out.println("Error geting email   password");
     }
     System.out.println("TLSEmail Start");
    
     Properties props = new Properties();
    
     props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
    
     props.put("mail.smtp.port", "587"); //TLS Port
    
     props.put("mail.smtp.auth", "true"); //enable authentication
    
     props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
    
        //create Authenticator object to pass in Session.getInstance argument
    
     final String EMAIL = AES.decrypt(email);
    
     final String PASSWORD = AES.decrypt(password);
    
     Authenticator auth = new Authenticator() {
         //override the getPasswordAuthentication method
         protected PasswordAuthentication getPasswordAuthentication() {
             return new PasswordAuthentication(EMAIL, PASSWORD);
         }
     };
     Session session = Session.getInstance(props, auth);
     EmailUtil.prepareEmail(session, toEmail,"This is your confirmation code:", code);
    }
    }
''''

''''

This is the method that is invoked from the .jsp page:

    @RequestMapping("enterCode")
    public String enterCode(){
        
        EmailUtil.sendEmail(email,"hello there");
    
        System.out.println("CODE: " code " ATTEMPTED TO BE SENT TO : " generalUser.getEmail());
    
        return "verification-form";
    }
''''
 

И это страница .jsp (не очень актуальная, но я все равно подумал включить ее):

 ''''
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Login</title>
    <meta name="description" content="Interactive Login Form.">
    <link rel="stylesheet" type="text/css" href="resources/css/main.css" />
    <link href="https://fonts.googleapis.com/css2?family=Nova Roundamp;display=swap" rel="stylesheet">
</head>

<body>

<div class = "container">

    <form:form action = "${pageContext.request.contextPath}editPage" modelAttribute="dbUser">

        <input type="submit" class = "submitButton" id = "editProfileButton" name = "form" value ="Edit Profile">

    </form:form>

    <br><br>
    <form:form action = "${pageContext.request.contextPath}enterCode" modelAttribute="dbUser">

        <input type="submit" class = "submitButton" id = "editProfileButton" name = "form" value ="Verify Email">

    </form:form>
 
</div>

</body>

</html>
''''
 

При вызове метода SendEmail() из любой точки среды IDE

При вызове функции SendEmail() со страницы .jsp, все остается как это forver

Ответ №1:

Я обнаружил, что он отлично работает в Google Chrome, но он все еще зависает в Safari. Я обновлю ответ, если найду решение для этого.