Как отправить письмо с вложением JavaMail - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь отправить письмо с вложением через javamail.Мой код:

   @Override
public boolean sendMessage(long id, String mailContent, Optional<MultipartFile> file) {
    Client client = clientService.get(id);
    String userName = SecurityContextHolder.getContext().getAuthentication().getName();
    logger.info("Sending email to " + client.getFullName() + " , sender " + userName);

    String mailSendTo = client.getEmail();

    String mailServerSmtpHost = environment.getRequiredProperty("spring.mail.host");
    String mailSmtpAuth = environment.getRequiredProperty("spring.mail.properties.mail.smtp.auth");
    String starttlsEnable = environment.getRequiredProperty("spring.mail.properties.mail.smtp.starttls.enable");
    String SMTPport = environment.getRequiredProperty("spring.mail.properties.mail.smtp.port");

    Properties property = System.getProperties();
    property.setProperty("mail.smtp.host", mailServerSmtpHost);
    property.setProperty("mail.smtp.port", SMTPport);
    property.setProperty("mail.smtp.auth", mailSmtpAuth);
    property.setProperty("mail.smtp.starttls.enable", starttlsEnable);

    Authenticator authenticator = new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(sendMailFrom, mailPassword);
        }
    };
    Session session = Session.getInstance(property, authenticator);
    try{
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setHeader("Content-type", "text/HTML; charset=UTF-8");
        mimeMessage.setHeader("format", "flowed");
        mimeMessage.setHeader("Content-Transfer-Encoding", "8bit");
        mimeMessage.setFrom(new InternetAddress(sendMailFrom));
        mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(mailSendTo));
        mimeMessage.setSubject("hi");

        MimeBodyPart content = new MimeBodyPart();
        content.setText(removeHTMLtags(mailContent));

        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(content);

        if (file.isPresent()){
            MultipartFile multipartFile = file.get();
            BodyPart bodyPart = new MimeBodyPart();
            String filePath = **"hardcodedPath"** + multipartFile.getOriginalFilename();
            DataSource dataSource = new FileDataSource(filePath);
            bodyPart.setDataHandler(new DataHandler(dataSource));
            bodyPart.setFileName(multipartFile.getOriginalFilename());
            multipart.addBodyPart(bodyPart);
        }
        mimeMessage.setContent(multipart);
        Transport.send(mimeMessage);
        return true;
    } catch (AddressException e) {

    } catch (MessagingException e) {

    }
    return false;
}

все работает нормально, за исключением того, что мне нужно получить абсолютный путь вложения, не жестко закодированный, а полученный во время выполнения.JS не может предоставить мне это, насколько я знаю.Кто-нибудь знает, как в этой ситуации получить абсолютный путь привязанности?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вам никогда не нужно хранить вложение как фактический файл.Если у вас есть байты для вложения в памяти, вы можете прикрепить их напрямую:

        MultipartFile multipartFile = file.get();
        BodyPart bodyPart = new MimeBodyPart();
        // choose MIME type based on file name
        String mimeType = FileTypeMap.getDefaultFileTypeMap().getContentType(multipartFile.getOriginalFilename());
        DataSource dataSource = new ByteArrayDataSource(multipartFile.getBytes(), mimeType);
        bodyPart.setDataHandler(new DataHandler(dataSource));
        bodyPart.setFileName(multipartFile.getOriginalFilename());
        bodyPart.setDisposition(Part.ATTACHMENT);
        multipart.addBodyPart(bodyPart);
0 голосов
/ 27 января 2019

Я решил проблему через транзитную папку

 private String downloadFile(MultipartFile file){
    String localPath = environment.getRequiredProperty("email.localfolder.send.attachment")
                                                        + file.getOriginalFilename();
    File f = new File(localPath);
    try {
        OutputStream outputStream = new FileOutputStream(f);
        outputStream.write(file.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return localPath;
}

, затем заменил

String filePath = **"hardcodedPath"** + multipartFile.getOriginalFilename();

на

String filePath = downloadFile(multipartFile);

, остальное - без изменений

Надеюсь, это кому-нибудь поможет.

...