如何使用JavaMail将多个文件附加到电子邮件?
以下Java代码用于将文件附加到电子邮件。我想通过电子邮件发送多个文件附件。如有任何建议,将不胜感激如何使用JavaMail将多个文件附加到电子邮件?,java,jakarta-mail,Java,Jakarta Mail,以下Java代码用于将文件附加到电子邮件。我想通过电子邮件发送多个文件附件。如有任何建议,将不胜感激 public class SendMail { public SendMail() throws MessagingException { String host = "smtp.gmail.com"; String Password = "mnmnn"; String from = "xyz@gmail.com"; St
public class SendMail {
public SendMail() throws MessagingException {
String host = "smtp.gmail.com";
String Password = "mnmnn";
String from = "xyz@gmail.com";
String toAddress = "abc@gmail.com";
String filename = "C:/Users/hp/Desktop/Write.txt";
// Get system properties
Properties props = System.getProperties();
props.put("mail.smtp.host", host);
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, toAddress);
message.setSubject("JavaMail Attachment");
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("Here's the file");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
try {
Transport tr = session.getTransport("smtps");
tr.connect(host, from, Password);
tr.sendMessage(message, message.getAllRecipients());
System.out.println("Mail Sent Successfully");
tr.close();
} catch (SendFailedException sfe) {
System.out.println(sfe);
}
}
}`
我已经有一段时间没有完成JavaMail工作了,但看起来您可以多次重复此代码:
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
例如,您可以编写一个方法来执行此操作:
private static void addAttachment(Multipart multipart, String filename)
{
DataSource source = new FileDataSource(filename);
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
}
然后从主代码调用:
addAttachment(multipart, "file1.txt");
addAttachment(multipart, "file2.txt");
etc只需使用要附加的第二个文件的文件名添加另一个块,并将其插入message.setContentmultipart命令之前
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
只需向多部分添加更多文件。具有数组列表al,其中包含您需要发送的附件列表,并使用以下给定代码
for(int i=0;i<al.size();i++)
{
System.out.println(al.get(i));
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource((String)al.get(i));
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName((String)al.get(i));
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
}
更新日期:2020年3月
使用目前最新的1.6版,事情就简单多了:
有用的读物
下面是一个很好的、切中要害的教程,其中包含完整的示例:
在Java Mail 1.3之后,附加文件更加简单 只需使用MimeBodyPart方法直接或从文件路径附加文件
MimeBodyPart messageBodyPart = new MimeBodyPart();
//messageBodyPart.attachFile(String filePath);
messageBodyPart.attachFile(File file);
multipart.addBodyPart(messageBodyPart);
这是用Spring 4+100%工作。您必须在您的gmail帐户上启用不太安全的选项。您还需要apache commons软件包: 文件上传 文件上传 1.4 @GetMapping/一些映射 公共空间mailMethod@RequestParamCommonsMultipartFile附件,@RequestParam CommonsMultipartFile附件2{ 属性mailProperties=新属性; mailProperties.putmail.smtp.auth,true; mailProperties.putmail.smtp.starttls.enable,true; mailProperties.putmail.smtp.ssl.enable,true; mailProperties.putmail.smtp.socketFactory.class,javax.net.ssl.SSLSocketFactory; mailProperties.putmail.smtp.socketFactory.fallback,false; JavaMailSenderImpl JavaMailSenderImpl=新JavaMailSenderImpl; javaMailSenderImpl.setJavaMailPropertiesmailProperties; javaMailSenderImpl.setHostsmtp.gmail.com; javaMailSenderImpl.setPort465; javaMailSenderImpl.setProtocolsmtp; javaMailSenderImpl.setUsername*********@gmail.com; javaMailSenderImpl.setPassword*****; javaMailSenderImpl.setDefaultEncodingUTF-8; 列表附件=新的ArrayList; 附件.addattachFile; 附件2.addattachFile2; javaMailSenderImpl.SendMimMessage->{ MimeMessageHelper messageHelper=新的mimemessagehelperminessage,true,UTF-8; messageHelper.setToemailTo; messageHelper.setSubjectsubject; messageHelper.setTextmessage; 如果!附件.equals{ 对于CommonsMultipartFile文件:附件{ messageHelper.addAttachmentfile.getOriginalFilename,文件; } } }; }
尝试从数组中读取文件名
MimeBodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
for(int i = 0 ; i < FilePath.length ; i++){
info("Attching the file + "+ FilePath[i]);
messageBodyPart.attachFile(FilePath[i]);
multipart.addBodyPart(messageBodyPart);
}
message.setContent(multipart);
我有一个更好的选择,可以在一封邮件中发送多个文件。多部件类允许我们非常容易地实现这个特性。如果您可能没有任何相关信息,请在此处阅读: Multipart类为我们提供了两个具有不同参数的同名方法,即addBodyPartBodyPart和addBodyPartBodyPart,int index。对于单个文件,我们可以使用第一种方法;对于多个文件,我们可以使用第二种方法,该方法采用两个参数
MimeMessage message = new MimeMessage(session);
Multipart multipart = new MimeMultipart();
message.setFrom(new InternetAddress(username));
for (String email : toEmails) {
message.addRecipient(Message.RecipientType.BCC, new InternetAddress(email));
}
message.setSubject(subject);
BodyPart messageBodyPart1 = new MimeBodyPart();
messageBodyPart1.setText(typedMessage);
multipart.addBodyPart(messageBodyPart1, i);
i = i + 1;
for (String filename : attachedFiles) {
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
messageBodyPart2.attachFile(filename);
multipart.addBodyPart(messageBodyPart2, i);
i = i + 1;
}
message.setContent(multipart);
Transport.send(message);
必须确保为每个附件创建新的mimeBodyPart。对象是通过引用传递的,因此如果仅执行以下操作:
MimeBodyPart messageAttachmentPart = new MimeBodyPart();
for (String fileName: files) {
messageAttachmentPart.attachFile(fileName);
multipart.addBodyPart(messageAttachmentPart);
}
它将多次附加相同的文件
@informatik01在上面发布了一个答案,其中有一个文档链接,其中有一个例子您应该始终对您提交的代码进行解释。这似乎不起作用。它只添加了最后一个附加的文件。在本例中,电子邮件只有file2.txt,我们可以通过传递参数来迭代它,而不是调用单独的方法。@Deva:恐怕我根本不理解您的评论。迭代什么,并将哪些参数传递给什么?请注意,OP没有要迭代的集合-他们只想添加多个单独的附件。所以,我建议您可以将multipart和文件名设置为对象的数组,并通过传递addAttachmentmultipartArray[I]、fileArray[I]等索引参数对其进行迭代@德瓦:是的,如果你碰巧在一个数组中有它们。不过,仅仅为了实现这一点而创建一个数组并没有什么意义,而且我在OP的源代码中没有看到这样的证据。这仍然需要调用一个单独的方法,因此我不确定我是否理解您的评论中的“不调用单独的方法”部分。是的,但它如何允许我们发送多个文件?
MimeBodyPart messageBodyPart = new MimeBodyPart();
Multipart multipart = new MimeMultipart();
for(int i = 0 ; i < FilePath.length ; i++){
info("Attching the file + "+ FilePath[i]);
messageBodyPart.attachFile(FilePath[i]);
multipart.addBodyPart(messageBodyPart);
}
message.setContent(multipart);
MimeMessage message = new MimeMessage(session);
Multipart multipart = new MimeMultipart();
message.setFrom(new InternetAddress(username));
for (String email : toEmails) {
message.addRecipient(Message.RecipientType.BCC, new InternetAddress(email));
}
message.setSubject(subject);
BodyPart messageBodyPart1 = new MimeBodyPart();
messageBodyPart1.setText(typedMessage);
multipart.addBodyPart(messageBodyPart1, i);
i = i + 1;
for (String filename : attachedFiles) {
MimeBodyPart messageBodyPart2 = new MimeBodyPart();
messageBodyPart2.attachFile(filename);
multipart.addBodyPart(messageBodyPart2, i);
i = i + 1;
}
message.setContent(multipart);
Transport.send(message);
for (String fileName: files) {
MimeBodyPart messageAttachmentPart = new MimeBodyPart();
messageAttachmentPart.attachFile(fileName);
multipart.addBodyPart(messageAttachmentPart);
}
MimeBodyPart messageAttachmentPart = new MimeBodyPart();
for (String fileName: files) {
messageAttachmentPart.attachFile(fileName);
multipart.addBodyPart(messageAttachmentPart);
}