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

218
01 декабря 2017, 05:19

Я пытаюсь отправить 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?

Answer 1

Проблема была в том, что я пыталась отправить пустое сообщение, без тела (почтовый клиент обычно разрешает посылать такие сообщения, но в моём случае это привело к ошибке).

Это выяснилось после того, как я добавила в сессию свойство

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

READ ALSO
Как освободить MediaPlayer от ресурсов?

Как освободить MediaPlayer от ресурсов?

Открываю новый файл по клику на кнопке:

188
Android. Проверка версии приложения в Play Market

Android. Проверка версии приложения в Play Market

Доброго времени сутокСразу же извиняюсь за возможную кривизну вопроса

168
запуск jboss 5.1 через прокси-сервер

запуск jboss 5.1 через прокси-сервер

Добрый день! Отсутствует соединение к Интернету при попытке перехода приложения на любой интернет-сайтВход в интернет должен осуществляется...

240
Сериализация/Десериализация объекта в java

Сериализация/Десериализация объекта в java

Сериализирую объект в файл на Android таким образом:

153