Come allegare più file ad una e-mail utilizzando JavaMail?

Il seguente codice Java viene utilizzato per allegare un file ad una mail. Voglio inviare più file allegati tramite e-mail. Ogni suggerimento sarà apprezzato.

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);
        }
    }
}` 
InformationsquelleAutor lakshmi | 2010-07-05



11 Replies
  1. 48

    Bene, è stato un po da quando ho fatto JavaMail lavoro, ma sembra che si potrebbe ripetere questo codice più volte:

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

    Per esempio, si potrebbe scrivere un metodo per farlo:

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

    Poi dal tuo principale codice, basta chiamare:

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

    ecc

    • Questo non sembra funzionare. Si aggiunge solo l’Ultimo file allegato (in questo caso, solo e-mail è file2.txt)
    • Soluzione funziona bene !!
    • invece di chiamare separato metodo siamo in grado di scorrere dal passaggio di parametri.
    • Temo di non capire il tuo commento a tutti. Scorrere il cosa e il passaggio di parametri per che cosa? Nota che l’OP non ha una collezione di scorrere – che solo si desidera aggiungere più allegati separati.
    • Voglio dire, Nell’esempio di cui sopra si chiama addAttachment() 2 volte. Così, ho solo suggerito che si può fare multipart e il nome del file sono come array di oggetti e ripetere dal passaggio di parametro di indice come addAttachment(multipartArray[i], fileArray[i]);
    • Sì, se si è già capita di hanno in un array. C’è un piccolo punto nella creazione di un array basta per farlo, anche se – e non vedo alcuna prova che questo è il caso, in OP il suo codice sorgente. (E che sarebbe ancora essere chiamata di un metodo separato, quindi non sono sicuro di aver capito la “invece di chiamare metodo separato” parte del tuo commento.)
    • Sì, hai ragione.

  2. 6
        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);
    • Si dovrebbe sempre dare un explanaiton informazioni sul codice presentare
    • Ma il codice è bene capire il concetto….
  3. 5

    Ora (con JavaMail 1.4), la cosa è più semplice:

    messageBodyPart.attachFile(File file)

    o:

    messageBodyPart.attachFile(String filePath)

  4. 2

    basta aggiungere un altro blocco con utilizzando il nome del secondo file che si desidera allegare e inserire prima il messaggio.setContent(multipart) comando

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

    Hanno Array list al che ha la lista degli allegati, è necessario di posta elettronica e utilizzare il seguente codice

    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);
                }
  6. 1
    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);
        }
    }
  7. 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);
    
            }
  8. 0

    Dopo di Posta Java 1.3 collegamento di file più semplice,

    • Basta usare MimeBodyPart metodi per allegare file direttamente da un percorso.

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

    Questo è woking 100% con Molla 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);
            }
        }
    });
  10. 0

    Proviamo a leggere il nome del file da matrice

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

Lascia un commento