2010-07-05 31 views
27

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

public class SendMail { 

    public SendMail() throws MessagingException { 
     String host = "smtp.gmail.com"; 
     String Password = "mnmnn"; 
     String from = "[email protected]"; 
     String toAddress = "[email protected]"; 
     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); 
     } 
    } 
}` 

Respuesta

41

Bueno, ha sido un tiempo desde que he hecho el trabajo de JavaMail, pero parece que sólo podría repetir este código varias veces:

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

Por ejemplo, se podría 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 de su código principal, a llamarlo:

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

etc

+0

Esto no parece funcionar. Solo agrega el último archivo adjunto (en este caso, el correo electrónico solo tiene archivo2.txt) – Jason

+0

¡La solución funciona bien! –

2

sólo tiene que añadir otro bloque con el uso del nombre de archivo del segundo archivo que desea adjuntar y la inserta antes del comando message.setContent (multiparte)

messageBodyPart = new MimeBodyPart(); 

    DataSource source = new FileDataSource(filename); 

    messageBodyPart.setDataHandler(new DataHandler(source)); 

    messageBodyPart.setFileName(filename); 

    multipart.addBodyPart(messageBodyPart); 
1

Sólo tiene que añadir más archivos en el multipart .

5
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); 
+1

Siempre debe dar una explicación sobre el código que envía – alestanis

+0

Pero el código está bien para entender el concepto .... –

1

Tienes lista de arreglo al que tiene la lista de archivos adjuntos que necesita para enviar por correo y utilizando un código a continuación se indica

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

ahora (con JavaMail 1.4), que es más simple:

messageBodyPart.attachFile(File file) 

o:

messageBodyPart.attachFile (String filePath)

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

     } 
0
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("<ARTHOS>"); 
     messageBodyPart.setDisposition(MimeBodyPart.INLINE); 
     multipart.addBodyPart(messageBodyPart); 
    } 
} 
0

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

  • sólo tiene que utilizar métodos MimeBodyPart adjuntar archivos directamente oa través de una ruta de archivo.

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

Esto es Woking 100% con la primavera 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<CommonsMultipartFile> 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); 
     } 
    } 
}); 
Cuestiones relacionadas