Вложения электронной почты не включены в Glassfish - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть класс 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();
}

Если я изменю эту функцию на метод, вызываемый моим сервлетом, с включенной отладкой, получающееся почтовое сообщение будет выглядетьнапример:

[#|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, но эта информация может быть полезна для решения проблемы.

1 Ответ

0 голосов
/ 02 декабря 2011

Оказалось, что мое решение этой проблемы вызвало текущую проблему. Наличие javax.mail.jar в моем загрузочном classpath и activ.jar в моем одобренном каталоге было единственным способом, которым я мог заставить работать с электронной почтой работу с регистратором, но тогда они не работали для нормального использования. Я понятия не имею, почему это так, но я обнаружил, что устранение опции -Xbootclasspath и удаление activ.jar из моего одобренного каталога решило проблему. Если у кого-то есть какие-либо предположения о том, почему, я был бы рад сделать еще несколько тестов и доложить. На данный момент, я думаю, я должен жить без регистрации электронной почты, потому что вложения являются требованием для моего приложения.

Возможно, если я переключусь на log4j вместо использования собственной регистрации Java EE 6, у меня будет лучшее из обоих миров.

...