Java Mail - Прикрепите несколько файлов PDF и отправьте почту - PullRequest
0 голосов
/ 06 мая 2019

Я хочу прикрепить несколько файлов PDF (в зависимости от номера квитанции, например, если доступно 2 квитанции, необходимо создать два вложения) и отправить письмо с помощью javamail.Я могу вложить один файл и отправить электронное письмо, но когда я делаю это для нескольких вложений, в приложении pdf нет содержимого.

Что я пробовал: -

ДляСоздание файла PDF: -

//rentReceiptId Will store receipt id of available receipt
String rentReceiptId[] = selectedCards.split(",");
int count = rentReceiptId.length;
byte[] bytes ={};
String filename[] = new String[count];
String byteArray[] = new String[count];


//For each receipt id create a pdf file
for(int i=0 ; i< rentReceiptId.length; i++) {

   ByteArrayOutputStream outputStream = null;
   try {
     outputStream = new ByteArrayOutputStream();
     outputStream.close();
     Document document = new Document();
     PdfWriter.getInstance(document, outputStream);
     document.open();
     document.addTitle("Rent Receipt PDF");
     document.addSubject("Testing email PDF");
     HTMLWorker htmlWorker=new HTMLWorker(document);
     String str = "<html><head></head><body>"+ "Contents that to be sent" +"</body></html>";
     htmlWorker.parse(new StringReader(str));
     document.addKeywords("iText, email");
     document.addAuthor("Test");
     document.addCreator("Test");
     document.close();
     bytes = outputStream.toByteArray();
     filename[i] = "RentReceipt-"+i+".pdf";
     String temp = new String(bytes);
     byteArray[i] = temp;

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


CompletableFuture.runAsync( () -> {
                    Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );

                        EmailUtils.sendEmailMultipleAttachment(mailerClient,recipientId, "Email Rent Receipt  Attachment","Please follow below attachment",recipientName,filename,byteArray);

                    }, Executors.newSingleThreadExecutor()).exceptionally(exc ->  {
                exc.printStackTrace();
                return null;});

}

EmailUtils.java: -

public class EmailUtils {
public static void sendEmailMultipleAttachment(MailerClient mailerClient,String recEmail, String subject, String content, String userName,String[] filename, String[] multiObject){
        Email email = new Email()
                    .setSubject(subject)
                    .setFrom("Test <info@Test.com>")
                    .addTo(userName + " <" + recEmail + ">")
                    .setBodyHtml("html Content");

for(int i=0; i< filename.length ; i++) {
                     byte[] fileContents = 
  multiObject[i].getBytes(Charset.forName("UTF-8"));


  //Not Working
  email.addAttachment(fileName[i], fileContents ,"application/pdf");

}

 try{

                mailerClient.send(email);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }


Прикреплено несколько файлов, но в них нет содержимого.Когда я попробовал один файл, он работает, где я иду не так?

1 Ответ

0 голосов
/ 07 мая 2019

Измените

 String temp = new String(bytes);
 byteArray[i] = temp;
 bytes = outputStream.toByteArray();

на

 bytes = outputStream.toByteArray();
 String temp = new String(bytes);
 byteArray[i] = temp;

Кстати, присвоение имени массиву String "byteArray" - не лучший выбор.: -)

Также было бы намного лучше просто передать массив байтовых массивов, а затем использовать ByteArrayDataSource в JavaMail, чтобы добавить вложение, но я не знаю, сможет ли ваш класс Email справиться с этим.

Преобразование байтового массива в строку, а затем обратно в байтовый массив может привести к повреждению содержимого.

...