#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>
''''
Ответ №1:
Я обнаружил, что он отлично работает в Google Chrome, но он все еще зависает в Safari. Я обновлю ответ, если найду решение для этого.