无法将消息追加到javax.mail中的文件夹

bob*_*hox 4 java james javax.mail

我正在设法保存包含正文,主题等的简单消息。但是,我无法保存多部分消息。我之前和之后都登录了appendMessages,但是注意到第二个日志不存在。有趣的是,我一点儿也没有例外。我绝对不知道这里出了什么问题。

这是我的Java代码:

    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
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用Apache James 3.0.4。任何方法都将受到欢迎

Gle*_*est 5

我正在使用Apache James 3.0.4

您不是说Apach James 3.0-beta4吗?也就是说,我们尚未达到3.0版本,因此没有3.0.4。有什么原因不使用稳定版本(2.3.2)?只是问问... :-)

我在appendMessages之前和之后进行了登录,但是注意到第二个日志不存在。

如果您永远不会只是在folder.appendMessages(new Message [] {m​​imeMessage})之后就登录代码,那么就有三种可能性:

  1. 一个错误(或Throwable的)被抛出内部javax.mail / IO代码。
    示例包括IOError(讨厌的IO接口故障),LinkageError(不兼容的jar /类)或CoderMalfunctionError(如果解码/编码循环抛出意外异常,则由CharsetDecoder或CharsetEncoder抛出)。
  2. 线程问题导致您的程序陷入停顿-即线程饥饿或死锁
  3. JVM进程崩溃

项(1)是迄今为止最有可能的。建议:将代码尾部更改为:

} catch (Exception e) {
    logger.error(e);

} catch (Throwable t) {
    logger.error(t);

} finally {
    closeMailStore(store, folder); // just simple method which closes the store
}
Run Code Online (Sandbox Code Playgroud)

如果随后记录了一个throwable,则可以从应用程序jar和配置,OS / JVM版本或数据内容方面调查原因。

如果这没有记录可抛出事件,则可以调查(2)或(3)。