2010-07-05 47 views
27

Mã Java sau được sử dụng để đính kèm tệp vào email. Tôi muốn gửi nhiều tệp đính kèm qua email. Mọi lơi đê nghị đêu nên được đanh gia cao.Cách đính kèm nhiều tệp vào một email bằng 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); 
     } 
    } 
}` 

Trả lời

41

Vâng, nó được một lúc kể từ khi tôi đã làm JavaMail làm việc, nhưng có vẻ như bạn chỉ có thể lặp lại mã này nhiều lần:

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

Ví dụ, bạn có thể viết một phương pháp để làm điều đó:

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

Sau đó từ mã chính của bạn, chỉ cần gọi:

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

vv

+0

này dường như không làm việc. Nó chỉ thêm tệp Cuối cùng được đính kèm (trong trường hợp này, email chỉ có tệp2.txt) – Jason

+0

Giải pháp hoạt động độc đáo !! –

2

chỉ cần thêm khối khác với việc sử dụng tên tập tin của tập tin thứ hai bạn muốn đính kèm và chèn nó trước khi message.setContent (nhiều phần dữ liệu) lệnh

messageBodyPart = new MimeBodyPart(); 

    DataSource source = new FileDataSource(filename); 

    messageBodyPart.setDataHandler(new DataHandler(source)); 

    messageBodyPart.setFileName(filename); 

    multipart.addBodyPart(messageBodyPart); 
1

Chỉ cần thêm tập tin vào 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

Bạn nên luôn luôn cung cấp cho một explanaiton về mã bạn gửi – alestanis

+0

Nhưng mã là tốt để hiểu khái niệm .... –

1

Có danh sách mảng al trong đó có danh sách các file đính kèm mà bạn cần để gửi và sử dụng mã dưới đây đưa ra

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

Bây giờ (với JavaMail 1.4), điều đơn giản:

messageBodyPart.attachFile(File file) 

hoặc:

messageBodyPart.attachFile (tệp chuỗiPath)

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

Sau Java Mail 1.3 đính kèm tệp đơn giản hơn,

  • Chỉ cần sử dụng các phương pháp MimeBodyPart để đính kèm tập tin trực tiếp hoặc từ một filepath.

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

này được Woking 100% với mùa xuân 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); 
     } 
    } 
}); 
Các vấn đề liên quan