Вложения электронной почты не включены в Glassfish
У меня есть класс 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 ответ
Оказалось, что мое решение этой проблемы вызвало текущую проблему. Наличие javax.mail.jar в моем загрузочном classpath и activ.jar в моей одобренной директории было единственным способом, которым я мог заставить обработку электронной почты работать с регистратором, но тогда они не работали для нормального использования. Я понятия не имею, почему это так, но я обнаружил, что устранение опции -Xbootclasspath и удаление activ.jar из моего одобренного каталога решило проблему. Если у кого-то есть предположение, почему, я был бы рад сделать еще несколько тестов и доложить. На данный момент, я думаю, я должен жить без регистрации электронной почты, потому что вложения являются требованием для моего приложения.
Возможно, если я переключусь на log4j вместо использования собственной регистрации Java EE 6, у меня будет лучшее из обоих миров.