4

本文、件名などを含む単純なメッセージを保存することはできますが、マルチパート メッセージを保存することはできません。の前後にログを記録appendMessagesしましたが、2 番目のログが存在しないことに気付きました。興味深いことに、例外が発生することはまったくありません。ここで何がうまくいかないのか、私にはまったくわかりません。

ここに私の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
    }

Apache James 3.0.4 を使用しています。どんなアプローチでも大歓迎です

4

3 に答える 3

3

James 2.3.2 でも同じエラーが発生しました。エクリプスを使っていました。ライブラリ設定のEclipseで、JREの代わりにJDKを追加しました。その後、私の問題は解決しました。同じことを試してください。あなたのコードは問題なく見え、コードに問題はないと思うので、うまくいくかもしれません。

于 2013-04-17T16:06:25.847 に答える
2

これを行う別の方法を見つけたので、他の誰かを助けることができることを願ってここに掲載しています. Mailet のserviceメソッドをオーバーライドしています。次に、org.apache.james.mailbox.MessageManagerappendMessageのメソッドを使用して、必要なフォルダーにメッセージを簡単に追加できます。ここに私の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;
  } 
}

予想通り、問題なくマルチパート メッセージを追加します。

于 2013-04-18T04:07:03.270 に答える