Страницы

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

среда, 25 декабря 2019 г.

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

#java #email


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


Ответы

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

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

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