JavaMail MimeBodyPart 未添加到 MimeMultipart "properly"

JavaMail MimeBodyPart is not being added to MimeMultipart "properly"

请明确 Java 工作正常。问题出在程序员身上!

我需要在电子邮件中添加 3 个附件(1 个 zip、1 个 png、1 个 jpeg)。最初我编写了可以自己添加每个项目的代码 - 而且它有效。然后为了同时添加所有 3 个项目,我采用了相同的代码(进行了非常小的修改)并将其放入 for 循环中。这是我遇到问题的地方。该循环向电子邮件添加了 3 个附件,但问题是所有附件都是相同的附件。具体来说,for循环的前2次迭代中应该附加的前2个附件没有附加,第3个附件(第3次迭代时up to bat的附件)附加了3次。

我阅读了 Java 文档,尝试了各种更改,但我很难理解哪里出了问题。现实是我没有足够的编程能力来前进。我卡住了。任何建议将不胜感激!我附上了大部分 class,但真正的问题出在 for 循环中 - 为什么所有 3 个唯一对象都没有被附上?

提前致谢。

    try 
    {
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress(userLogin));

        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(primaryRecipient));


         MimeBodyPart bodyPart = new MimeBodyPart(); //container to hold the email contents (body only - the text)

         bodyPart.setText(emailBody);

         MimeMultipart multipart = new MimeMultipart();


         multipart.addBodyPart(bodyPart);


         MimeBodyPart mimePart = new MimeBodyPart();

         String filename; //hold the current path
         FileDataSource resource;//object to grab the physical resource

         for(int i = 0; i < itemsToAttach.length; i++)
         {

             filename = itemsToAttach[i];
             System.out.println("Test: " + itemsToAttach[i]);//#############################test only

             resource = new FileDataSource(filename);

             mimePart.setDataHandler(new DataHandler(resource));

             mimePart.setFileName(filename);//###########fix the long ugly name


             multipart.addBodyPart(mimePart);
             System.out.println("multipart contents: " + multipart.toString());
         }


         message.setContent(multipart);

         message.setSubject(emailSubject);

         Transport.send(message);

         System.out.println("Sent message successfully....");
    } 
    catch (MessagingException e) 
    {
        throw new RuntimeException(e);
    }

输出如下所示:

The file is present!
Sending cc to: mikexxxxxxx@hotmail.com
Sending bcc to: mikexxxxxx@gmail
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\test attachments.zip
multipart contents: javax.mail.internet.MimeMultipart@164da25
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\axiom.jpeg
multipart contents: javax.mail.internet.MimeMultipart@164da25
Test: C:\Users\Mike\workspace\Z_ToTransfer\Assig4_SendEmails\part2_send_email_with_attachment\attachments\another attachment.png
multipart contents: javax.mail.internet.MimeMultipart@164da25
Sent message successfully....

看起来您正在重复使用同一个对象,并且它在循环的每次迭代中都会被覆盖。这就是为什么当你发送消息时唯一的条目是最后一个 mime 部分:

您可以执行以下操作:

为每个新文件创建不同的 MimebodyPart 对象:

     MimeBodyPart[] mimePart = new MimeBodyPart[itemsToAttach.length];

     String filename; //hold the current path
     FileDataSource resource;//object to grab the physical resource

     for(int i = 0; i < itemsToAttach.length; i++)
        {
        mimePart[i] = new MimeBodyPart();
         filename = itemsToAttach[i];
         System.out.println("Test: " + itemsToAttach[i]);//#############################test only

         resource = new FileDataSource(filename);

         mimePart[i].setDataHandler(new DataHandler(resource));

         mimePart[i].setFileName(filename);//###########fix the long ugly name


         multipart.addBodyPart(mimePart[i]);
         System.out.println("multipart contents: " + multipart.toString());
     }