Отправка Multipart MimeMessage отправляет пустое письмо - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над этим проектом, который требует от нас посылать ежедневные отчеты по почте в форматах pdf и xlsx. Я читал об использовании многокомпонентных сообщений для такой задачи, поэтому я написал код ниже для его выполнения:

public void sendEmail(String toEmail, String subject, String body, ByteArrayOutputStream pdfBaos, ByteArrayOutputStream xlsBaos) {
    System.out.println("TLSEmail Start");
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com"); // SMTP Host
    props.put("mail.smtp.port", "587"); // TLS Port
    props.put("mail.smtp.auth", "true"); // enable authentication
    props.put("mail.smtp.starttls.enable", "true"); // enable STARTTLS
    Authenticator auth = new Authenticator() {
            // override the getPasswordAuthentication method
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(fromEmail, password);
            }
        };
    Session session = Session.getInstance(props, auth);
    try {
            MimeMessage msg = new MimeMessage(session);
            // set message headers
            msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
            msg.addHeader("format", "flowed");
            msg.addHeader("Content-Transfer-Encoding", "8bit");

            msg.setFrom(new InternetAddress(Config
                    .getProperty("reporter.mail.username"), "DailyReport"));

            msg.setReplyTo(InternetAddress.parse(
                    Config.getProperty("reporter.mail.username"), false));

            msg.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(toEmail, false));

            msg.setSubject(subject, "UTF-8");

            msg.setSentDate(new Date());

            // Create a multipart message for attachment
            Multipart multipart = new MimeMultipart();

            // Create the message body part
            BodyPart messageBodyPart = new MimeBodyPart();
            // Fill the message
            messageBodyPart.setText(body);
            // Set text message part
            multipart.addBodyPart(messageBodyPart);

            // Second part is attachment
            MimeBodyPart pdfAttachmentBodyPart = new MimeBodyPart();
            DataSource pdfAttachment = new ByteArrayDataSource(pdfBaos.toByteArray(), "application/pdf");
            String pdfFileName = "report.pdf";
            pdfAttachmentBodyPart.setDataHandler(new DataHandler(pdfAttachment));
            pdfAttachmentBodyPart.setFileName(pdfFileName);

            MimeBodyPart xlsAttachmentBodyPart = new MimeBodyPart();
            DataSource xlsAttachment = new ByteArrayDataSource(xlsBaos.toByteArray(), "application/vnd.ms-excel");
            String xlsFileName = "report.xls";
            xlsAttachmentBodyPart.setDataHandler(new DataHandler(xlsAttachment));
            xlsAttachmentBodyPart.setFileName(xlsFileName);

            multipart.addBodyPart(pdfAttachmentBodyPart);
            multipart.addBodyPart(xlsAttachmentBodyPart);

            // Send the complete message parts
            msg.setContent(multipart);
            // msg.setText(body, "UTF-8");


            System.out.println("Message is ready");
            Transport.send(msg);
            System.out.println("EMail Sent Successfully!!");

        } catch (Exception e) {
            e.printStackTrace();
    }
}

Но при этом отправляется только пустое электронное письмо на нужный адрес. Теперь я подозревал, что с отправкой файлов что-то не так, поэтому я попытался просто отправить текст bodyPart, но доставленная почта также была пустой. Я также пытался создать MimeMultipart с параметром «mixed», но это ничего не исправило.

Установка текста в MimeMessage с помощью метода setText работает нормально, но это оставляет меня с проблемой того, как отправлять вложения .pdf и .xlsx вместе с ним.

Я использую javax.mail 1.5.0-b01 и apache TomEE 7.0. Отчеты создаются с помощью jasperreports.

Заранее спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Я не нахожу проблем с кодом.

  1. Убедитесь, что у вас есть соответствующие версии mail.jar activation.jar
  2. Еще одна вещь, если вы можете попробовать это:

    String pdfFileName = "report.pdf"; DataSource source = new FileDataSource(pdfFilename); // DataSource pdfAttachment = new ByteArrayDataSource(pdfBaos.toByteArray(), "application/pdf");

...