Страницы

Поиск по вопросам

среда, 28 ноября 2018 г.

Отправка email (java)

Я пытаюсь отправить 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 был успешно отправлен.

Комментариев нет:

Отправить комментарий