【问题标题】:Email attachments not included within GlassfishGlassfish 中不包含电子邮件附件
【发布时间】:2011-11-17 16:33:41
【问题描述】:

我编写了一个 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 中工作,但这些信息可能有助于解决问题。

【问题讨论】:

    标签: java email glassfish attachment jakarta-mail


    【解决方案1】:

    原来我对this problem的解决方案导致了当前的问题。在我的引导类路径中拥有 javax.mail.jar 和在我认可的目录中拥有activation.jar 是我可以使用记录器进行电子邮件处理的唯一方法,但是它们无法正常使用。我不知道为什么会这样,但我发现消除 -Xbootclasspath 选项并从我认可的目录中删除 activation.jar 解决了这个问题。如果有人对原因有任何猜测,我很乐意进行更多测试并报告。现在,我想我必须在没有电子邮件记录的情况下生活,因为附件是我的应用程序的要求。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2019-10-10
      • 2014-07-23
      • 2011-06-22
      • 2011-04-10
      相关资源
      最近更新 更多