2013-04-09 56 views
4

我正在管理保存包含正文,主题等的简单消息。但是,我无法保存多部分消息。我在appendMessages之前和之后登录,但注意到第二个日志不存在。有趣的是,我没有任何异常被解雇。我完全不知道这里出了什么问题。无法将消息追加到javax.mail中的文件夹中

这里是我的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 3.0.4詹姆斯。任何方法都会受到欢迎

+0

你可以在appendMessages方法内进行调试吗? – dierre 2013-04-09 06:01:56

+1

我会在代码的可疑区域寻找Throwable。如果你真的想更多地关注这个问题,你可以给我们更多的信息。你看起来像你在这里有一个完整的方法;提取整个方法,看看你是否可以设置一个围绕它的框架在服务器之外运行。我不知道这是否可行,但如果是这样的话,你可以学到很多东西,而不必通过所有服务器的东西。错误通常以这种方式被发现,甚至在它们到达SO之前。 – arcy 2013-04-12 03:17:34

回答

4

我使用Apache 3.0.4詹姆斯

你不是说APACH詹姆斯3.0 BETA4?即我们还没有达到3.0版本,所以没有3.0.4。任何你没有使用稳定版本的原因(2.3.2)?只是问... :-)

我在appendMessages之前和之后记录,但注意到第二个日志不存在。

如果你没有机会到日志代码刚过folder.appendMessages(新留言[] {}的MimeMessage);,则存在三种可能性:

  1. 一种错误(或的Throwable)被抛出内部javax.mail/IO代码。
    实例包括IO错误(讨厌IO接口故障), LinkageError类(不相容罐子/班)或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 
} 

如果再登录一抛出,就可以探讨应用罐子方面&配置,OS/JVM版本,或者数据内容...

原因

如果这不记录一个throwable,你可以调查(2)或(3)。

+0

谢谢你详细解释。我愿意明天检查并告诉你,上帝愿意。 – boburShox 2013-04-14 09:58:10

+0

无法通过'Throwable'来捕捉,而** 2 **没有成功(我确定没有_deadlock_)。就** 3 **而言,我的其他同事也遇到同样的问题(所以也许没有任何JVM进程崩溃)。请看看@ Marvik的回答中的评论。我找到了另一种方式。谢谢! – boburShox 2013-04-18 03:47:08

3

我也得到了与詹姆斯2.3.2相同的错误。我正在使用eclipse。在库设置的eclipse中,我添加了JDK来代替JRE。然后我的问题解决了。尝试一样。它可能会工作,因为你的代码看起来很好,并且我认为代码没有问题。

+0

我已经尝试过,实际上。但我一直无法解决这个问题。然后我决定使用Mailets来改变程序。在那里我使用'org.apache.james.mailbox.MessageManager'类,它有一个名为'append'的方法。这工作正常! :) – boburShox 2013-04-18 03:38:55

2

我发现了另一种方法,我希望能帮助别人。 我重写Mailet的service方法。然后通过appendMessage方法org.apache.james.mailbox.MessageManager的帮助,我可以简单地将我的消息添加到我想要的文件夹。这是我的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; 
    } 
} 

如我所料其追加任何多部分邮件没有概率。

相关问题