2011-11-17 56 views
0

我有一封MailMessage类,用于管理从我的应用程序发送的电子邮件。它对纯文本消息起作用很好,当我在命令行上手动编译和运行它时,附件逻辑工作,但在Glassfish 3.1中运行它时未能包含附件。我假设必须有一些微妙的类加载问题,我在命令行上通过设置CLASSPATH环境来破坏,但是我一直无法弄清楚需要更改哪个应用程序服务器设置。下面是在命令行中运行时,我用它来创建和发送我的邮件代码:Glassfish中未包含的电子邮件附件

public static void main(String[] args) throws Exception { 
    String[] toAddr = new String[] {"[email protected]"}; 
    String subject = "This is a test"; 
    String data = "This is a message body"; 
    MailMessage mailMessage = new MailMessage(toAddr, subject, data); 
    mailMessage.addAttachment(new File("/etc/hosts"), "text/plain"); 
    mailMessage.send(); 
} 

如果我改变了功能,一个由我的servlet调用的方法,启用调试,所产生的邮件看起来是这样的:

[#|2011-11-17T11:21:37.710-0500|INFO|glassfish3.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=105;_ThreadName=Thread-1;|Date: Thu, 17 Nov 2011 11:21:37 -0500 (EST) 
From: [email protected] 
To: [email protected] 
Message-ID: <9116840.7.1321546897580.JavaMail...> 
Subject: This is a test 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
     boundary="----=_Part_6_16232037.1321546897569" 

. 
|#] 

通过比较,当我运行在命令行上相同的代码,它显示了所有的附件,每一个与所述单独的消息边界。这是我使用添加附件到底层的MimeMessage功能:

private Multipart buildMultipartMessage(String messageBody) 
     throws MessagingException { 
    MimeBodyPart messagePart = new MimeBodyPart(); 
    messagePart.setText(messageBody.toString()); 

    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messagePart); 

    // Attach each of our files 
    for (File part : attachment.keySet()) { 
    BodyPart attachmentPart = new MimeBodyPart(); 
    attachmentPart.setDataHandler(new DataHandler(new FileDataSource(part))); 
    attachmentPart.setFileName(part.getName() + ".txt"); 
    attachmentPart.setHeader("Content-Type", attachment.get(part)); 
    attachmentPart.setHeader("Content-ID", part.getName()); 
    attachmentPart.setDisposition(Part.ATTACHMENT); 
    multipart.addBodyPart(attachmentPart); 
    } 

    return multipart; 
} 

由我的班MAILMESSAGE调用,像这样使用:

Message message = new MimeMessage(session); 
message.setFrom(new InternetAddress("[email protected]")); 
InternetAddress[] addresses = new InternetAddress[mailTo.length]; 
for (int i = 0; i < mailTo.length; i++) 
    addresses[i] = new InternetAddress(mailTo[i]); 
message.setRecipients(Message.RecipientType.TO, addresses); 
message.setSubject(subject); 
message.setSentDate(new Date()); 

Multipart multipart = buildMultipartMessage(messageBody.toString()); 
message.setContent(multipart); 

再次,所有这些代码,完全按照原样编译,运行并在命令行上运行时生成带有附件的有效电子邮件。只有当我在Glassfish中做同样的事情时才会得到一条空的消息。

有关如何诊断此问题的任何建议将不胜感激。

史蒂夫

UPDATE:

如果我添加此代码调用buildMultipartMessage()之后,但message.setContent(多)之前,我可以看到的内容是正确的:

try { 
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/var/tmp/stf")); 
    multipart.writeTo(bos); 
    bos.close(); 
    } catch (Exception ex) { } 

/var/tmp/stf文件包含带附件和分隔符的完整邮件正文。我仍然困惑于为什么它可以从命令行运行,但不在Glassfish内运行,但这些信息可能有助于解决问题。

回答

0

原来,我的解决方案this problem导致了目前的问题。我的引导类路径中有javax.mail.jar,在我的背书目录中有activation.jar,这是我能够使用记录器处理电子邮件处理的唯一方式,但是这样做对于正常使用来说并不起作用。我不知道这是为什么,但我发现消除-Xbootclasspath选项并从我的背书目录中删除activation.jar解决了问题。如果有人对此有任何猜测,我很乐意做一些更多的测试并回报。现在,我想我必须没有电子邮件日志,因为附件是我的应用程序的要求。

也许如果我切换到log4j而不是使用本机Java EE 6日志记录,我可以两全其美。