Как прикрепить несколько файлов к электронной почте с помощью JavaMail? - PullRequest
32 голосов
/ 05 июля 2010

Следующий Java-код используется для прикрепления файла к электронному письму.Я хочу отправить несколько файлов вложения по электронной почте.Любые предложения будут оценены.

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

Ответы [ 11 ]

48 голосов
/ 05 июля 2010

Ну, я уже давно работал с 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");

и т. Д.

6 голосов
/ 20 июня 2012
    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);
5 голосов
/ 18 ноября 2012

Теперь (с JavaMail 1.4) все проще:

messageBodyPart.attachFile(File file)

или

messageBodyPart.attachFile (String filePath)

2 голосов
/ 05 июля 2010

просто добавьте еще один блок, используя имя файла второго файла, который вы хотите прикрепить, и вставьте его перед командой message.setContent (multipart)

    messageBodyPart = new MimeBodyPart();

    DataSource source = new FileDataSource(filename);

    messageBodyPart.setDataHandler(new DataHandler(source));

    messageBodyPart.setFileName(filename);

    multipart.addBodyPart(messageBodyPart);
1 голос
/ 05 августа 2016
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);
    }
}
1 голос
/ 05 июля 2012

У вас есть Array 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);
            }
1 голос
/ 05 июля 2010

Просто добавьте больше файлов к multipart.

0 голосов
/ 19 декабря 2018

Попробуйте прочитать имя файла из массива

 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);
0 голосов
/ 06 ноября 2017

Это 100% пробуждается с пружиной 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);
        }
    }
});
0 голосов
/ 24 апреля 2017

После присоединения файла к Java Mail 1.3 проще,

  • Просто используйте методы MimeBodyPart, чтобы прикрепить файл напрямую или из пути к файлу.

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