无法将邮件附加到javax.mail中的文件夹

无法将邮件附加到javax.mail中的文件夹,java,jakarta-mail,james,Java,Jakarta Mail,James,我正在设法保存包含正文、主题等的简单消息。但是,我无法保存多部分消息。我在添加消息之前和之后记录了日志,但注意到第二个日志不存在。有趣的是,我没有被解雇的例外。我完全不知道这里出了什么问题 以下是我的Java代码: Store store = null; Folder folder = null; String folderName = "sentbox"; try { Session session = prepareSession(MailPr

我正在设法保存包含正文、主题等的简单消息。但是,我无法保存多部分消息。我在
添加消息之前和之后记录了日志,但注意到第二个日志不存在。有趣的是,我没有被解雇的例外。我完全不知道这里出了什么问题

以下是我的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
    }
Store-Store=null;
文件夹=null;
字符串folderName=“sentbox”;
试一试{
会话=准备会话(MailProtocols.IMAP,kid);
store=session.getStore(“imap”);
connect(myHost,user.getLogin(),user.getPassword());
folder=store.getFolder(folderName);
如果(folder==null | |!folder.exists()){
folder.create(folder.HOLDS_邮件);
}
文件夹。打开(文件夹。读写);
MimeMessage MimeMessage=新MimeMessage(会话);
地址[]to=null;
如果(msg.getTo()!=null){//msg是自定义消息类的实例,则没有什么特别的
int msgSize=msg.getTo().size();
to=新的Internet地址[msgSize];
对于(int i=0;i”;
e、 printStackTrace();
}
}
mimessage.setContent(mp);
mimeMessage.saveChanges();
}否则{
mimeMessage.setText(msg.getBody());
}
文件夹.appendMessages(新邮件[]{mimeMessage});
Message[]allMessages=folder.getMessages();
UIDFolder UIDFolder=(UIDFolder)文件夹;
long savedMsgId=uidFolder.getUID(allMessages[allMessages.length-1]);
logger.info(“savedMsgId”,savedMsgId+”“)//根本无法获取此输出
}捕获(例外e){
错误(e);
}最后{
closeMailStore(store,folder);//关闭存储的简单方法
}
我正在使用ApacheJames3.0.4。欢迎采取任何办法

我正在使用ApacheJames3.0.4

你是说阿帕奇·詹姆斯3.0-beta4吗?i、 我们还没有达到3.0版本,所以没有3.0.4版本。您不使用稳定版本(2.3.2)的任何原因?只是问…:-)

我在添加消息之前和之后都记录了日志,但注意到第二个日志不存在

如果您从未在folder.appendMessages(新消息[]{mimeMessage})之后获得日志代码,则有三种可能性:

  • javax.mail/IO代码中抛出了一个错误(或可丢弃的
    示例包括IOError(严重的IO接口故障), LinkageError(不兼容的JAR/类)或CoderMalfunctionError (由CharsetDecoder或CharsetEncoder抛出,如果解码/编码 循环引发意外的异常)
  • 线程问题会导致程序停止,即线程不足或死锁
  • 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
    }
    
    如果这记录了一个可丢弃的日志,您可以从应用程序JAR和配置、OS/JVM版本或数据内容等方面调查原因


    如果这没有记录一个可丢弃的日志,您可以调查(2)或(3)。

    我在James 2.3.2中也遇到了同样的错误。我正在使用eclipse。在eclipse In library设置中,我添加了JDK来代替JRE。然后我的问题就解决了。试试同样的。它可能会起作用,因为您的代码看起来很好,而且我认为代码没有问题。

    我找到了另一种方法来实现这一点,我希望我能帮助其他人。 我正在覆盖Mailet的
    服务
    方法。然后借助的
    appendMessage
    方法,我可以简单地将我的邮件添加到我想要的文件夹中。以下是我的JAVA代码:

    public class MyMailet extends GenericMailet {
    
    
    @Resource(name = "mailboxmanager")
    private MailboxManager mailboxManager;
    
    private String sentbox;
    
    @Override
    public void init() throws MessagingException {
        super.init();     
    
        this.sentbox = getInitParameter("sent", "sentbox");
    }
    
    
    @SuppressWarnings("unchecked")
    @Override
    public void service(Mail mail) throws MessagingException {
        // Here, I am putting my logic which has to decide which folder to put
        // ...
    
    
        putToFolder(mail.getMessage(), mail.getSender().toString(), sentbox);
    
        mail.setState(Mail.GHOST);
    }   
    
    private long putToFolder(MimeMessage message, String userName, String folderName) throws MessagingException {
        MailboxSession session = null;
        long appendedMessageId;
        try {
            session = mailboxManager.createSystemSession(userName, new MailetContextLog(getMailetContext()));
    
            MessageManager mailbox = getMessageManager(session, userName, folderName);
            appendedMessageId = mailbox.appendMessage(new MimeMessageInputStream(message), new Date(), session, true, null);
    
        } catch (BadCredentialsException e) {
            throw new MessagingException("Unable to authenticate to mailbox", e);
        } catch (MailboxException e) {
            throw new MessagingException("Unable to access mailbox.", e);
        } finally {
            if (session != null) {
                session.close();
            }
    
            try {
                mailboxManager.logout(session, true);
                mailboxManager.endProcessingRequest(session);
            } catch (MailboxException e) {
                throw new MessagingException("Can logout from mailbox", e);
            }
    
        }
    
        return appendedMessageId;
    }
    
    private MessageManager getMessageManager(MailboxSession session, String userName, String folderName) throws MailboxException, MessagingException {
        mailboxManager.startProcessingRequest(session);
    
        MailboxPath path = new MailboxPath(MailboxConstants.USER_NAMESPACE, userName, folderName);
    
        if (!mailboxManager.mailboxExists(path, session)) {
            mailboxManager.createMailbox(path, session);
        }
        MessageManager messageManager = mailboxManager.getMailbox(path, session);
        if (messageManager == null) {
            throw new MessagingException("Mailbox for username " + userName + " was not found on this server.");
        }
    
        return messageManager;
      } 
    }
    

    正如我预期的那样,它会在没有问题的情况下附加任何多部分消息。

    您能在appendMessages方法中进行调试吗?我会在可疑代码区域中查找一次性消息。如果你真的想得到更多的关注,你可以给我们更多的信息。你看起来几乎有一个完整的方法在这里;提取整个方法,看看是否可以围绕它设置一个框架,以便在服务器外部运行。我不知道这是否可行,但如果可行的话,你可以学到很多关于它的知识,而不必经历所有服务器的东西。bug经常是这样被发现的,甚至在它们被发现之前。感谢您的详细解释。如果上帝愿意的话,我明天会检查并让你知道的。无法通过
    可丢弃的
    ,并且2(I)没有成功