Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cannot append a message to a folder in javax.mail

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

like image 965
boburShox Avatar asked Dec 27 '22 06:12

boburShox


2 Answers

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:

  1. 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).
  2. Thread problems cause your program to reach a standstill - i.e. thread starvation or deadlock
  3. 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).

like image 169
Glen Best Avatar answered Jan 08 '23 15:01

Glen Best


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.

like image 29
Mavrick Avatar answered Jan 08 '23 15:01

Mavrick