|
From: Vladimir O. <VO...@ci...> - 2006-06-22 14:51:56
|
Hi, everyone.
=20
I ran into a weird bug/issue with JavaMailSenderImpl. The
JavaMailSenderImpl.doSend(MimeMessage[], Object[]) has the following
piece of code:
=20
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Transport transport =3D getTransport(getSession());
transport.connect(getHost(), getPort(), getUsername(),
getPassword());
try {
for (int i =3D 0; i < mimeMessages.length; i++) {
MimeMessage mimeMessage =3D mimeMessages[i];
try {
if (mimeMessage.getSentDate() =3D=3D null) {
mimeMessage.setSentDate(new Date());
}
mimeMessage.saveChanges();
transport.sendMessage(mimeMessage,
mimeMessage.getAllRecipients());
}
catch (MessagingException ex) {
Object original =3D (originalMessages !=3D null ? =
originalMessages[i]
: mimeMessage);
failedMessages.put(original, ex);
}
}
}
finally {
transport.close();
}
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
=20
The problem occurs when the message you are sending contains
non-existent attachments (as 'MimeBodyPart' of MimeMultipart object).
When that happens, 'transport' is getting completely disconnected for
some reason and the next message from MimeMessage array fails with
non-MessageException type exception, so the 'for' loop terminates
prematuraly. That is the operation fails because of 'Not Connected'
exception and the real cause for exception is completely hidden from the
user. Don't have the stack trace with me right now unfortunatelly.
=20
I assume it's a bug in Sun's JavaMail package, but it's quite easy to
put a generic fix into Spring code (so, that it won't be that dependent
on the bugs in the underlying libraries). Putting 'connected' inside the
for loop would be sufficient and does fix the problem.
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
Transport transport =3D getTransport(getSession());
try {
for (int i =3D 0; i < mimeMessages.length; i++) {
if (!transport.connected())
transport.connect(getHost(), getPort(), getUsername(),
getPassword());
MimeMessage mimeMessage =3D mimeMessages[i];
try {
if (mimeMessage.getSentDate() =3D=3D null) {
mimeMessage.setSentDate(new Date());
}
mimeMessage.saveChanges();
transport.sendMessage(mimeMessage,
mimeMessage.getAllRecipients());
}
catch (MessagingException ex) {
Object original =3D (originalMessages !=3D null ? =
originalMessages[i]
: mimeMessage);
failedMessages.put(original, ex);
}
}
}
finally {
transport.close();
}
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
=20
Thanks.
=20
Vlad
=20
PS: I'm using Spring 1.2.6.
|