IOException при отправке сообщения - файл не найден - PullRequest
0 голосов
/ 29 мая 2018

Я отправляю письмо со встроенным изображением, но проблема в том, что он выдает ошибку FileNotFound Я использую правильный путь, но все равно выдает ошибку, кто-нибудь может сказать мне, где я ошибаюсь?

Код

public void forgotPasswordMail(String email,String token)
    {
          String to = email;
          Properties props = new Properties();
          props.put("mail.smtp.auth", "true");
          props.put("mail.smtp.starttls.enable", "true");
          props.put("mail.smtp.host", host);
          props.put("mail.smtp.port", "587");
          Session session = Session.getInstance(props,
             new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                   return new PasswordAuthentication(username, password);
           }
             });
          try {
                Message message = new MimeMessage(session);
                  message.setFrom(new InternetAddress(from));
                  message.setSubject("Reset Password");
                  message.setRecipients(Message.RecipientType.TO,
                             InternetAddress.parse(to));

                       MimeMultipart multipart = new MimeMultipart("related");
                       BodyPart messageBodyPart = new MimeBodyPart();
                       String htmlText = //"<img src=\"cid:image\"> " + 
                       "<html><head><style>h1 {background-color: #FFF100;padding: 15px; text-indent: 40px;} " +
                          "p {text-indent: 60px;}</style></head><body><h1>Forgot password request</h1> " +
                           "<p> Please click on the following link to set new password</p>" + 
                           "<p>" + frontendUrl+"resetForgottonPassword/"+token+"</p></div></body></html>";

                       messageBodyPart.setContent(htmlText, "text/html");
                       // add it
                       multipart.addBodyPart(messageBodyPart);
                       messageBodyPart = new MimeBodyPart();

                       DataSource fds = new FileDataSource(
                          "/home/tahir/sportsacademy-backend/assets/Logo.png");
                       messageBodyPart.setFileName("logo.png");
                       messageBodyPart.setDataHandler(new DataHandler(fds));
                       messageBodyPart.setHeader("Content-ID", "<image>");}

                       multipart.addBodyPart(messageBodyPart); 
                       message.setContent(multipart);
                       Transport.send(message); 
                 System.out.println("Sent message successfully....");

          } catch (MessagingException e) {
             throw new RuntimeException(e);
          }
       }

И файл также имеет права на чтение и запись

Расположение файла

File is prresent here

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Возможно, путь к файлу неверный, потому что вы используете домашнюю папку.Вы проверили этот пост: Доступ к "~" (домашняя страница пользователя) из Java в Linux ?

Есть еще одна вещь;Вы заканчиваете блок try, затем добавляете некоторый код, после чего запускается блок catch.Это не работает, потому что перехват должен начаться сразу после попытки (но, возможно, он был скопирован неправильно).

0 голосов
/ 29 мая 2018

Существует несколько причин, по которым это может произойти, но я предполагаю, что проблема в том, что вы ищете файл в расположении файловой системы, а ваша программа работает в веб-контексте, где корневая папка отличается.Если вы создаете веб-приложение, даже если вы разрабатываете его в папке / home, оно выполняется в веб-контексте, предоставленном контейнером сервлета или из вашей IDE с использованием встроенного контейнера сервлета).И фактическая структура папок немного отличается.Это связано с тем, что в общей среде веб-приложений существует инкапсуляция, и каждое приложение может получать доступ только к файлам, которые являются его частью (в противном случае вы можете изменять файлы, которые не принадлежат вам).

Таким образом, чтобы проверить это, и если вы работаете в веб-среде, вы можете проверить фактическую папку, вызвав метод getRealPath ("/") в контексте вашего сервлета, который показывает вам фактический путь к файловой системе.Но в основном вам нужно обращаться к ресурсам, используя их относительный путь в контексте веб-приложения, а не в файловой системе.

...