Я пытаюсь отправить email с помощью следующего кода:
try {
String mailFrom = "sender@mail.ru";
String pass = "pass";
String mailTo = "recipient@gmail.com";
java.util.Properties props = new Properties();
props.put("mail.smtp.host", "smtp.mail.ru");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.connectiontimeout", "60000"); // 60 seconds
props.put("mail.smtp.timeout", "60000");
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication(mailFrom, pass));
}
});
Message msg = new MimeMessage(session);
InternetAddress addressFrom = new InternetAddress(mailFrom);
msg.setFrom(addressFrom);
InternetAddress addressTo = new InternetAddress(mailTo);
msg.setRecipient(Message.RecipientType.TO, addressTo);
msg.setSubject("testemail");
Transport.send(msg);
} catch (Throwable e) {
System.err.println("Exception : " + e.toString());
}
но получаю ошибку:
Exception : javax.mail.MessagingException: Could not convert socket to
TLS;
nested exception is: javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
При этом я добавила ssl-сертификат mail.ru в хранилище сертификатов JVM, и он был успешно добавлен.
Если же я добавляю в сессию следующее свойство:
props.put("mail.smtp.ssl.trust", "*");
то по прошествии минуты (по истечении установленного таймаута) получаю другую ошибку:
Exception : javax.mail.MessagingException: Exception reading response;
nested exception is: java.net.SocketTimeoutException: Read timed out
Как исправить это и всё-таки отправить email?
Ответ
Проблема была в том, что я пыталась отправить пустое сообщение, без тела (почтовый клиент обычно разрешает посылать такие сообщения, но в моём случае это привело к ошибке).
Это выяснилось после того, как я добавила в сессию свойство
props.put("mail.debug", "true");
После этого в отладочной информации я увидела причину ошибки:
354 Enter message, ending with "." on a line by itself
DEBUG SMTP: MessagingException while sending, THROW:
javax.mail.MessagingException: No MimeMessage content
После получения этого описания ошибки я добавила тело сообщения:
msg.setText("Test message!");
и email был успешно отправлен.
Комментариев нет:
Отправить комментарий