cannot append a message to a folder in javax.mail

jakarta-mail, james, java

Solution

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:

- An Error (or Throwable) is being thrown inside javax.mail / IO code. Examples include IOError (nasty IO interfacing failure), LinkageError (incompatible jars/classes) or CoderMalfunctionError (thrown by CharsetDecoder or CharsetEncoder if the decoding/encoding loop throws an unexpected exception).

- Thread problems cause your program to reach a standstill - i.e. thread starvation or deadlock

- JVM process crash

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).

Problem

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

Original source