如何使用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.setContent(multipart)命令之前
只需将更多文件添加到
multipart
multipart mp=new MimeMultipart();
Multipart mp = new MimeMultipart();
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setContent(body,"text/html");
mp.addBodyPart(mbp1);
if(filename!=null)
{
MimeBodyPart mbp2 = null;
FileDataSource fds =null;
for(int counter=0;counter<filename.length;counter++)
{
mbp2 = null;
fds =null;
mbp2=new MimeBodyPart();
fds = new FileDataSource(filename[counter]);
mbp2.setDataHandler(new DataHandler(fds));
mbp2.setFileName(fds.getName());
mp.addBodyPart(mbp2);
}
}
msg.setContent(mp);
msg.setSentDate(new Date());
Transport.send(msg);
MimeBodyPart mbp1=新的MimeBodyPart();
mbp1.setContent(正文,“text/html”);
mp.addBodyPart(mbp1);
如果(文件名!=null)
{
MimeBodyPart mbp2=null;
FileDataSource fds=null;
对于(int counter=0;counter具有数组list 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);
}
for(int i=0;i更新(2020年3月)
有了最新版本(目前为1.6版),事情就简单多了:
有用的读物
下面是一个很好的、切中要害的教程,其中包含完整的示例:
Multipart Multipart=新的MimeMultipart(“混合”);
for(int alen=0;attlen
文件f=新文件(文件路径);
文件[]附件=f.listFiles();
//第二部分是附件
对于(int i=0;i
在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(“/some mapping”)
public void mailMethod(@RequestParam commonmultipartfile attachFile,@RequestParam commonmultipartfile attachFile2){
属性mailProperties=新属性();
mailProperties.put(“mail.smtp.auth”,true);
mailProperties.put(“mail.smtp.starttls.enable”,true);
mailProperties.put(“mail.smtp.ssl.enable”,true);
mailProperties.put(“mail.smtp.socketFactory.class”、“javax.net.ssl.SSLSocketFactory”);
mailProperties.put(“mail.smtp.socketFactory.fallback”,false);
JavaMailSenderImpl JavaMailSenderImpl=新的JavaMailSenderImpl();
setJavaMailProperties(mailProperties);
setHost(“smtp.gmail.com”);
javaMailSenderImpl.setPort(465);
javaMailSenderImpl.setProtocol(“smtp”);
javaMailSenderImpl.setUsername(“*********@gmail.com”);
javaMailSenderImpl.setPassword(“*******”);
javaMailSenderImpl.setDefaultEncoding(“UTF-8”);
列表附件=新的ArrayList();
附件。添加(附件文件);
附件。添加(附件2);
javaMailSenderImpl.send(mimessage->{
mimessagehelper messageHelper=新的mimessagehelper(mimessage,true,“UTF-8”);
messageHelper.setTo(emailTo);
messageHelper.setSubject(subject);
messageHelper.setText(message);
如果(!attachments.equals(“”){
用于(CommonsMultipartFile文件:附件){
messageHelper.addAttachment(文件.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);
MimeBodyPart messageBodyPart=新的MimeBodyPart();
Multipart Multipart=新的MimeMultipart();
for(int i=0;i
我有一个更好的选择,可以在一封邮件中发送多个文件。Multipart类允许我们非常轻松地实现此功能。如果您可能没有任何相关信息,请从这里阅读:
Multipart类为我们提供了两个具有不同参数的同名方法,即addBodyPart(BodyPart部分)和addBodyPart(BodyPart部分,int index)。对于单个文件,我们可以使用第一种方法;对于多个文件,我们可以使用第二种方法(使用两个参数)
您必须确保为每个附件创建一个新的mimeBodyPart。对象是通过引用传递的,因此如果您只执行以下操作:
MimeBodyPart messageAttachmentPart = new MimeBodyPart();
for (String fileName: files) {
messageAttachmentPart.attachFile(fileName);
multipart.addBodyPart(messageAttachmentPart);
}
它将多次附加相同的文件
@informatik01在上面发布了一个答案,其中有一个文档链接,其中有一个例子您应该始终解释您提交的代码。这似乎不起作用。它只添加最后附加的文件(在这种情况下,电子邮件只有file2.txt)我们可以通过传递参数来迭代它,而不是调用单独的方法。@Deva:恐怕我根本不理解你的评论。迭代什么,然后呢
MimeBodyPart messageBodyPart = new MimeBodyPart();
//messageBodyPart.attachFile(String filePath);
messageBodyPart.attachFile(File file);
multipart.addBodyPart(messageBodyPart);
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);
}