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());
}
请明确 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());
}