¿Cómo adjuntar múltiples archivos a un correo electrónico usando JavaMail?

El siguiente código Java se usa para adjuntar un archivo a un correo electrónico. Deseo enviar archivos adjuntos múltiples por correo electrónico. Cualquier sugerencia sera apreciada.

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); } } }` 

Bueno, hace mucho que no trabajo en JavaMail, pero parece que podrías repetir este código varias veces:

 DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); 

Por ejemplo, puedes escribir un método para hacerlo:

 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); } 

Luego, desde su código principal, solo llame:

 addAttachment(multipart, "file1.txt"); addAttachment(multipart, "file2.txt"); 

etc

  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 

Ahora (con JavaMail 1.4), la cosa es más simple:

 messageBodyPart.attachFile(File file) 

o:

messageBodyPart.attachFile (String filePath)

simplemente agregue otro bloque usando el nombre del archivo del segundo archivo que desea adjuntar e insértelo antes del comando message.setContent (multipart)

  messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); 

Simplemente agregue más archivos a la multipart .

Haga que la lista de Array contenga la lista de archivos adjuntos que necesita enviar por correo y use el siguiente código.

 for(int i=0;i 
 File f = new File(filepath); File[] attachments = f.listFiles(); // Part two is attachment for( int i = 0; i < attachments.length; i++ ) { if (attachments[i].isFile() && attachments[i].getName().startsWith("error")) { messageBodyPart = new MimeBodyPart(); FileDataSource fileDataSource =new FileDataSource(attachments[i]); messageBodyPart.setDataHandler(new DataHandler(fileDataSource)); messageBodyPart.setFileName(attachments[i].getName()); messageBodyPart.setContentID(""); messageBodyPart.setDisposition(MimeBodyPart.INLINE); multipart.addBodyPart(messageBodyPart); } } 
  Multipart multipart = new MimeMultipart("mixed"); for (int alen = 0; attlen < attachments.length; attlen++) { MimeBodyPart messageAttachment = new MimeBodyPart(); fileName = ""+ attachments[attlen]; messageAttachment.attachFile(fileName); messageAttachment.setFileName(attachment); multipart.addBodyPart(messageAttachment); } 

Después de adjuntar el archivo Java Mail 1.3 más simple,

  • Simplemente use los métodos MimeBodyPart para adjuntar archivos directamente o desde un archivo de ruta.

     MimeBodyPart messageBodyPart = new MimeBodyPart(); //messageBodyPart.attachFile(String filePath); messageBodyPart.attachFile(File file); multipart.addBodyPart(messageBodyPart); 

Esto es woking al 100% con Spring 4+

 @RequestParam CommonsMultipartFile attachFile; @RequestParam CommonsMultipartFile attachFile2; Properties mailProperties = new Properties(); 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 = new JavaMailSenderImpl(); javaMailSenderImpl.setJavaMailProperties(mailProperties); javaMailSenderImpl.setHost("smtp.gmail.com"); javaMailSenderImpl.setPort(465); javaMailSenderImpl.setProtocol("smtp"); javaMailSenderImpl.setUsername("*********@gmail.com"); javaMailSenderImpl.setPassword("*******"); javaMailSenderImpl.setDefaultEncoding("UTF-8"); List attachments = new ArrayList<>(); attachments.add(attachFile); attachments.add(attachFile2); javaMailSenderImpl.send(mimeMessage -> { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setTo(emailTo); messageHelper.setSubject(subject); messageHelper.setText(message); if (!attachments.equals("")) { for (CommonsMultipartFile file : attachments) { messageHelper.addAttachment(file.getOriginalFilename(), file); } } });