如何使用JavaMail将多个文件附加到电子邮件?

如何使用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

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

我已经有一段时间没有完成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.setContentmultipart命令之前

    messageBodyPart = new MimeBodyPart();

    DataSource source = new FileDataSource(filename);

    messageBodyPart.setDataHandler(new DataHandler(source));

    messageBodyPart.setFileName(filename);

    multipart.addBodyPart(messageBodyPart);

只需向多部分添加更多文件。

具有数组列表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);
            }
更新日期:2020年3月 使用目前最新的1.6版,事情就简单多了:

有用的读物 下面是一个很好的、切中要害的教程,其中包含完整的示例:


在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/一些映射 公共空间mailMethod@RequestParamCommonsMultipartFile附件,@RequestParam CommonsMultipartFile附件2{ 属性mailProperties=新属性; mailProperties.putmail.smtp.auth,true; mailProperties.putmail.smtp.starttls.enable,true; mailProperties.putmail.smtp.ssl.enable,true; mailProperties.putmail.smtp.socketFactory.class,javax.net.ssl.SSLSocketFactory; mailProperties.putmail.smtp.socketFactory.fallback,false; JavaMailSenderImpl JavaMailSenderImpl=新JavaMailSenderImpl; javaMailSenderImpl.setJavaMailPropertiesmailProperties; javaMailSenderImpl.setHostsmtp.gmail.com; javaMailSenderImpl.setPort465; javaMailSenderImpl.setProtocolsmtp; javaMailSenderImpl.setUsername*********@gmail.com; javaMailSenderImpl.setPassword*****; javaMailSenderImpl.setDefaultEncodingUTF-8; 列表附件=新的ArrayList; 附件.addattachFile; 附件2.addattachFile2; javaMailSenderImpl.SendMimMessage->{ MimeMessageHelper messageHelper=新的mimemessagehelperminessage,true,UTF-8; messageHelper.setToemailTo; messageHelper.setSubjectsubject; messageHelper.setTextmessage; 如果!附件.equals{ 对于CommonsMultipartFile文件:附件{ messageHelper.addAttachmentfile.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);

我有一个更好的选择,可以在一封邮件中发送多个文件。多部件类允许我们非常容易地实现这个特性。如果您可能没有任何相关信息,请在此处阅读:

Multipart类为我们提供了两个具有不同参数的同名方法,即addBodyPartBodyPart和addBodyPartBodyPart,int index。对于单个文件,我们可以使用第一种方法;对于多个文件,我们可以使用第二种方法,该方法采用两个参数

 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);
必须确保为每个附件创建新的mimeBodyPart。对象是通过引用传递的,因此如果仅执行以下操作:

 MimeBodyPart messageAttachmentPart = new MimeBodyPart();
  
 for (String fileName: files) {
            messageAttachmentPart.attachFile(fileName);
            multipart.addBodyPart(messageAttachmentPart);
        }
它将多次附加相同的文件


@informatik01在上面发布了一个答案,其中有一个文档链接,其中有一个例子

您应该始终对您提交的代码进行解释。这似乎不起作用。它只添加了最后一个附加的文件。在本例中,电子邮件只有file2.txt,我们可以通过传递参数来迭代它,而不是调用单独的方法。@Deva:恐怕我根本不理解您的评论。迭代什么,并将哪些参数传递给什么?请注意,OP没有要迭代的集合-他们只想添加多个单独的附件。所以,我建议您可以将multipart和文件名设置为对象的数组,并通过传递addAttachmentmultipartArray[I]、fileArray[I]等索引参数对其进行迭代@德瓦:是的,如果你碰巧在一个数组中有它们。不过,仅仅为了实现这一点而创建一个数组并没有什么意义,而且我在OP的源代码中没有看到这样的证据。这仍然需要调用一个单独的方法,因此我不确定我是否理解您的评论中的“不调用单独的方法”部分。是的,但它如何允许我们发送多个文件?
 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);
        }