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