2015-02-24 91 views
1

我这里可以发送邮件与多个附件:如何使用多个附件发送邮件,在java中

Properties props = System.getProperties(); 
String host = "smtp.gmail.com"; 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.host", host); 
props.put("mail.smtp.user", from); 
props.put("mail.smtp.password", pass); 
props.put("mail.smtp.port", "587"); 
props.put("mail.smtp.auth", "true"); 

Session session = Session.getDefaultInstance(props); 
MimeMessage message = new MimeMessage(session); 
Multipart multipart = new MimeMultipart(); 

// creates body part for the message 
MimeBodyPart messageBodyPart = new MimeBodyPart(); 
messageBodyPart.setContent(message, "text/html"); 

//set message body 
BodyPart msgBodyPart = new MimeBodyPart(); 
msgBodyPart.setText(body); 
multipart.addBodyPart(msgBodyPart); 
msgBodyPart = new MimeBodyPart(); 

//attach file 
DataSource source = new FileDataSource(attachFile); 
messageBodyPart.setDataHandler(new DataHandler(source)); 
messageBodyPart.setFileName(attachFile); 
multipart.addBodyPart(messageBodyPart); 

//attach file 2 
source = new FileDataSource(attachFile2); 
BodyPart messageBodyPart2 = new MimeBodyPart(); 
messageBodyPart2.setDataHandler(new DataHandler(source)); 
messageBodyPart2.setFileName(attachFile2); 
multipart.addBodyPart(messageBodyPart2); 

try { 
    message.setFrom(new InternetAddress(from)); 
    InternetAddress[] toAddress = new InternetAddress[to.length]; 

     // To get the array of addresses 
    for(int i = 0; i < to.length; i++) { 
     toAddress[i] = new InternetAddress(to[i]); 
    } 

    for(int i = 0; i < toAddress.length; i++) { 
     message.addRecipient(Message.RecipientType.TO, toAddress[i]); 
    } 
} catch (MessagingException ex) { 
    ex.printStackTrace(); 
} 

message.setSubject(subject); 
message.setContent(multipart); 
Transport transport = session.getTransport("smtp"); 
transport.connect(host, from, pass); 
transport.sendMessage(message, message.getAllRecipients()); 
transport.close(); 

但问题是我怎么可以添加多个附件吗?我不知道我是否可以声明多个变量或将它放在数组上。该代码只能包含2个附件,如果每次发送电子邮件中有5个或任何附件。

+3

这里是一个重击出去的想法。创建一个名为'attach'的方法,它将'File'和'Multipart'作为参数。你可以多次调用它,看看会发生什么:) – MadProgrammer 2015-02-24 03:06:46

+0

你知道Java是如何工作的吗? (具体来说,变量,对象和数组是如何工作的)。如果你这样做,应该很容易看到如何附加一组文件。 – immibis 2015-02-24 03:11:37

回答

2

创建一个简单的方法来调用,像,attachFile,这需要一个FileMultipartMimeBodyPart作为参数...

public void attachFile(File file, Multipart multipart, MimeBodyPart messageBodyPart) { 
    DataSource source = new FileDataSource(file); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(attachFile); 
    multipart.addBodyPart(messageBodyPart);  
} 

往往你需要

File attachFiles[] = ... 

if (attachFiles > 0) { 
    //attach file 
    attachFile(attachFiles[0], multipart, messageBodyPart); 
    if (attachFiles > 1) { 
     for (int index = 1; index < attachFiles.length; index++) { 
      attachFile(attachFiles[0], multipart, new MimeBodyPart()); 
     } 
    } 
} 

如说它一个例子

+0

感谢您对这篇文章的回复。我试图应用这个将几个文件附加到一个电子邮件。我使用了与发布相同的attachFile方法,除了我将第一个参数作为“字符串文件名”而不是“文件文件”。我尝试使用attachFile(“extract_emails.csv”,multipart,messageBodyPart)附加文件。 attachFile(“Compare.txt”,multipart,messageBodyPart);'没有错误,但我看到compare.txt已连接两次到邮件并且extract_emails根本没有连接。不知道我哪里错了。 @MadProgrammer – 2017-06-21 16:44:09

0

看看这里给出的答案

https://stackoverflow.com/a/3177640/772590

步骤1 创建一个数据源

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

步骤2创建方法来添加上述方法附着

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

步骤3调用添加附件

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

使用Java邮件1.4及以上使得安装文件更简单,

MimeBodyPart messageBodyPart = new MimeBodyPart(); 

messageBodyPart.attachFile(String filePath)

multipart.addBodyPart(messageBodyPart); 
相关问题