我有以下代码发送包含多个部分的电子邮件
public void sendEmail(String emailAddress, List<String> attachment) throws Exception{
Properties props = new Properties();
props.put("mail.transport.protocol", "smtps");
props.put("mail.smtps.host", SMTP_HOST_NAME);
props.put("mail.smtps.auth", "true");
Session mailSession = Session.getDefaultInstance(props);
mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
// message subject
message.setSubject("Automated email from Kieran Herley about Assignments");
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(emailAddress));
Multipart multipart = new MimeMultipart();
MimeBodyPart messageBodyPart = new MimeBodyPart();
// message body
messageBodyPart.setText("This is just a message to say your assignment has been graded.\nAttached is a file with some pointers about your assignment");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
for (String singleFile : attachment) {
DataSource source = new FileDataSource(singleFile);
messageBodyPart.setDataHandler(new DataHandler(source));
String nameOfFile = singleFile.substring(singleFile.lastIndexOf('\\') + 1);
messageBodyPart.setFileName(nameOfFile);
multipart.addBodyPart(messageBodyPart);
}
message.setContent(multipart);
transport.connect(SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD);
transport.sendMessage(message,
message.getRecipients(Message.RecipientType.TO));
transport.close();
}
一切正常,但我遇到的问题是在for-loop
for (String singleFile : attachment) {
DataSource source = new FileDataSource(singleFile);
messageBodyPart.setDataHandler(new DataHandler(source));
String nameOfFile = singleFile.substring(singleFile.lastIndexOf('\\') + 1);
messageBodyPart.setFileName(nameOfFile);
multipart.addBodyPart(messageBodyPart);
}
message.setContent(multipart);
我遇到的问题是,如果应用程序循环遍历for循环3次,它会将附加到电子邮件的所有文件命名为第三次通过循环传递的文件的名称。这与电子邮件附件本身也是一样的,即使是发送3个附件,它们都被命名为相同。
这是因为所有三个附件都使用相同的变量来命名它们并检索所以这三个附件都是命名它们并将它们设置为通过循环传递的最后一个。
有没有办法通过对所有人使用相同的名称变量和附件变量来设置每封电子邮件的名称和附件,或者我该怎么做?
在这种情况下使用
String singleFile --- for the attachment
String nameOfFile --- for the name of each file
答案 0 :(得分:3)
我不确定我理解你需要什么,但是这条线可能有意义:
messageBodyPart = new MimeBodyPart();
在for循环中,而不是之前。目前,您继续将相同的身体部位添加到multipart
。
答案 1 :(得分:3)
对于for-each循环中的字符串看起来没什么问题。我担心在为其分配datahandler和filename时总是使用相同的messageBodyPart
实例。尝试在循环中移动messageBodyPart = new MimeBodyPart()
。