I am managing to save simple messages containing body, subject etc. However, I am unable to save multipart messages. I logged before and after appendMessages
, but noticed that the second log is absent. Interestingly, I have no Exceptions being fired at all. I have absolutely no idea about what is going wrong here.
Here is my Java code:
Store store = null;
Folder folder = null;
String folderName = "sentbox";
try {
Session session = prepareSession(MailProtocols.IMAP, kid);
store = session.getStore("imap");
store.connect(myHost, user.getLogin(), user.getPassword());
folder = store.getFolder(folderName);
if (folder == null || !folder.exists()) {
folder.create(Folder.HOLDS_MESSAGES);
}
folder.open(Folder.READ_WRITE);
MimeMessage mimeMessage = new MimeMessage(session);
Address[] to = null;
if(msg.getTo() != null) { // msg is an instance of custom message class, nothing special there
int msgSize = msg.getTo().size();
to = new InternetAddress[msgSize];
for (int i = 0; i < msgSize; i++) {
to[i] = new InternetAddress(msg.getTo().get(i));
}
}
mimeMessage.setRecipients(RecipientType.TO, to);
mimeMessage.setSentDate(new Date(System.currentTimeMillis()));
mimeMessage.setSubject(msg.getSubject());
if (msg.getFiles() != null) {
MimeMultipart mp = new MimeMultipart();
MimeBodyPart newPart = new MimeBodyPart();
newPart.setText(msg.getBody());
mp.addBodyPart(newPart);
for (MultipartFile multipartFile : msg.getFiles()) {
try {
newPart = new MimeBodyPart(); // create new part to each files
newPart.addHeader("My-File-Type", multipartFile.getContentType());
File tmpFile = File.createTempFile("newAttachment", ".tmp");
multipartFile.transferTo(tmpFile);
FileDataSource fds = new FileDataSource(tmpFile);
newPart.setDataHandler(new DataHandler(fds));
newPart.setFileName(multipartFile.getOriginalFilename());
newPart.setDisposition(Part.ATTACHMENT);
mp.addBodyPart(newPart);
tmpFile.deleteOnExit();
} catch (IOException e) {
logger.debug("Can not create temp file ===========>");
e.printStackTrace();
}
}
mimeMessage.setContent(mp);
mimeMessage.saveChanges();
} else {
mimeMessage.setText(msg.getBody());
}
folder.appendMessages(new Message[] {mimeMessage});
Message[] allMessages = folder.getMessages();
UIDFolder uidFolder = (UIDFolder) folder;
long savedMsgId = uidFolder.getUID(allMessages[allMessages.length - 1]);
logger.info("savedMsgId",savedMsgId + "") //cannot get this output at all
} catch (Exception e) {
logger.error(e);
} finally {
closeMailStore(store, folder); // just simple method which closes the store
}
I am using Apache James 3.0.4. Any approaches would be welcome
I am using Apache James 3.0.4
Don't you mean Apach James 3.0-beta4? i.e. we haven't yet reached 3.0 release, so there is no 3.0.4. Any reason you're not using the stable release (2.3.2)? Just asking... :-)
I logged before and after appendMessages, but noticed that the second log is absent.
If you never get to logging code just after folder.appendMessages(new Message[] {mimeMessage});, then there are three possibilities:
Item (1) is by far the most probable here. Suggestion: change tail-end of code to:
} catch (Exception e) {
logger.error(e);
} catch (Throwable t) {
logger.error(t);
} finally {
closeMailStore(store, folder); // just simple method which closes the store
}
IF this then logs a throwable, you can investigate the cause in terms of app jars & configuration, OS/JVM version, or data content...
IF this doesn't log a throwable, you can investigate (2) or (3).
I was also getting the same error with James 2.3.2. I was using eclipse. In eclipse in library settings I added JDK in place of JRE. Then my problem was resolved. Try the same. It may work because your code looks fine and there is no problem with the code I think.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With