我有一个MailMessage类,我写过来管理从我的应用程序发送电子邮件。它适用于纯文本消息,当我在命令行上手动编译和运行它时,附件逻辑工作,但是当我在Glassfish 3.1中运行它时,它无法包含我的附件。我假设必须有一些微妙的类加载问题,我在命令行上通过设置我的CLASSPATH环境来破坏,但我无法弄清楚我需要更改哪个应用程序服务器设置。这是我在命令行上运行时用来创建和发送邮件消息的代码:
public static void main(String[] args) throws Exception {
String[] toAddr = new String[] {"steve.ferguson@epsilon.com"};
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: sender@mydomain.com
To: steve.ferguson@mydomain.com
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("sender@mydomain.com"));
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中做同样的事情时才会得到一条空信息。
对于如何诊断这一点的任何建议都将非常感激。
史蒂夫
更新:
如果我在调用buildMultipartMessage()之后但在message.setContent(multipart)之前添加此代码,我可以看到内容是正确的:
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/var/tmp/stf"));
multipart.writeTo(bos);
bos.close();
} catch (Exception ex) { }
/ var / tmp / stf文件包含带附件和分隔符的完整邮件正文。我仍然很困惑为什么这可以从命令行工作,但不在Glassfish中,但这些信息可能有助于解决问题。
答案 0 :(得分:0)
事实证明,我对this problem的解决方案导致了当前的问题。在我的引导类路径中使用javax.mail.jar,在我的endorsed目录中使用activation.jar是我可以使用记录器处理电子邮件处理的唯一方法,但是它们不能正常使用。我不知道为什么会这样,但我发现消除-Xbootclasspath选项并从我的endorsed目录中删除activation.jar修复了问题。如果有人对什么有任何猜测,我会很乐意做更多的测试和报告。现在,我想我必须没有电子邮件记录,因为附件是我的应用程序的要求。
也许如果我切换到log4j而不是使用本机Java EE 6日志记录,我可以充分利用这两个世界。