如何使用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.setContent(multipart)命令之前


只需将更多文件添加到
multipart

multipart mp=new MimeMultipart();
    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);
MimeBodyPart mbp1=新的MimeBodyPart(); mbp1.setContent(正文,“text/html”); mp.addBodyPart(mbp1); 如果(文件名!=null) { MimeBodyPart mbp2=null; FileDataSource fds=null;
对于(int counter=0;counter具有数组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);
            }
for(int i=0;i更新(2020年3月)
有了最新版本(目前为1.6版),事情就简单多了:


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

Multipart Multipart=新的MimeMultipart(“混合”);
for(int alen=0;attlen
文件f=新文件(文件路径);
文件[]附件=f.listFiles();
//第二部分是附件
对于(int i=0;i
在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(“/some mapping”)
      public void mailMethod(@RequestParam commonmultipartfile attachFile,@RequestParam commonmultipartfile attachFile2){
      属性mailProperties=新属性();
      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=新的JavaMailSenderImpl();
      setJavaMailProperties(mailProperties);
      setHost(“smtp.gmail.com”);
      javaMailSenderImpl.setPort(465);
      javaMailSenderImpl.setProtocol(“smtp”);
      javaMailSenderImpl.setUsername(“*********@gmail.com”);
      javaMailSenderImpl.setPassword(“*******”);
      javaMailSenderImpl.setDefaultEncoding(“UTF-8”);
      列表附件=新的ArrayList();
      附件。添加(附件文件);
      附件。添加(附件2);
      javaMailSenderImpl.send(mimessage->{
      mimessagehelper messageHelper=新的mimessagehelper(mimessage,true,“UTF-8”);
      messageHelper.setTo(emailTo);
      messageHelper.setSubject(subject);
      messageHelper.setText(message);
      如果(!attachments.equals(“”){
      用于(CommonsMultipartFile文件:附件){
      messageHelper.addAttachment(文件.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);
      
      MimeBodyPart messageBodyPart=新的MimeBodyPart();
      Multipart Multipart=新的MimeMultipart();
      for(int i=0;i
      我有一个更好的选择,可以在一封邮件中发送多个文件。Multipart类允许我们非常轻松地实现此功能。如果您可能没有任何相关信息,请从这里阅读:

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

      您必须确保为每个附件创建一个新的mimeBodyPart。对象是通过引用传递的,因此如果您只执行以下操作:

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


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

      您应该始终解释您提交的代码。这似乎不起作用。它只添加最后附加的文件(在这种情况下,电子邮件只有file2.txt)我们可以通过传递参数来迭代它,而不是调用单独的方法。@Deva:恐怕我根本不理解你的评论。迭代什么,然后呢
      MimeBodyPart messageBodyPart = new MimeBodyPart();
      
      //messageBodyPart.attachFile(String filePath);
      messageBodyPart.attachFile(File file);
      
      multipart.addBodyPart(messageBodyPart);
      
       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);
              }