2012-02-06 107 views
0

我一直在苦苦挣扎了一段时间,找不到解决问题的答案。 该场景如下: 在Google应用引擎中使用了一个使用play framework的Web应用程序。试图将2个pdf文件附加到电子邮件并发送。有了一个文件,它完美地工作。有两个我得到错误。 以下是代码: package app;将多个文件附加到电子邮件中

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.MimeType; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
import javax.mail.util.ByteArrayDataSource; 


public class Mailer { 

    public static void sendEmail(String to, String subject, String body, byte[]  pdf1, byte[] pdf2) 
    throws AddressException, MessagingException, UnsupportedEncodingException{ 
     Properties props = new Properties(); 
     Session session = Session.getDefaultInstance(props, null); 
     Message msg = new MimeMessage(session); 
     msg.setFrom(new InternetAddress("[email protected]", "John Smith")); 
     msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to, to)); 
     msg.setSubject(subject); 
     msg.setText(body); 

     Multipart mp = new MimeMultipart(); 

     MimeBodyPart htmlPart = new MimeBodyPart(); 
     htmlPart.setContent(body, "text/html"); 
     mp.addBodyPart(htmlPart); 

     //Attaching first pdf 
     MimeBodyPart attachment = new MimeBodyPart(); 
     attachment.setFileName("pdf1.pdf"); 
     DataSource src = new ByteArrayDataSource(pdf1, "application/pdf"); 
     attachment.setDataHandler(new DataHandler(src)); 
     mp.addBodyPart(attachment); 


     //Attaching second pdf 
     attachment = new MimeBodyPart(); 
     attachment.setFileName("pdf2.pdf"); 
     src = new ByteArrayDataSource(badgePDF, "application/pdf"); 
     attachment.setDataHandler(new DataHandler(src)); 
     mp.addBodyPart(attachment); 


     msg.setContent(mp); 

     Transport.send(msg); 
    } 


} 

不幸的是我,即使我打印捕获异常的stackTrack没有错误消息,但我我的猜测是,有与数据源对象的问题。我很感激任何帮助。

回答

0

对于您的DataSource类型,您应该使用FileDataSource而不是使用ByteArrayDataSource。尝试以下方法:通过应用程序生成

Multipart mp = new MimeMultipart(); 
MimeBodyPart htmlPart = new MimeBodyPart(); 
htmlPart.setContent(body, "text/html"); 
mp.addBodyPart(htmlPart);  

File[] attachments = new File[2]; 
atts[1] = new File("pdf1.pdf"); 
atts[2] = new File("pdf2.pdf"); 
for(int i = 0; i < attachments.length; i++) { 
    messageBodyPart = new MimeBodyPart(); 
    FileDataSource fileDataSource =new FileDataSource(attachments[i]); 
    messageBodyPart.setDataHandler(new DataHandler(fileDataSource)); 
    messageBodyPart.setFileName(attachments[i].getName()); 
    mp.addBodyPart(messageBodyPart); 

} 

msg.setContent(mp); 
Transport.send(msg); 
+0

PDF和,因为我不能保存在谷歌应用程序引擎的文件不会被保存在服务器上的文件中,这就是为什么数据是一个字节数组。 – 2012-02-06 22:47:22

+0

您是否尝试过使用[MultiPartEmail](http://commons.apache.org/email/apidocs/org/apache/commons/mail/MultiPartEmail.html) – 2012-02-06 22:59:06

+0

据我所知我无法使用org.apache.commons。 – 2012-02-06 23:57:05