在轮询后使邮件标记为未读--Apache Camel

时间:2014-09-16 09:38:48

标签: java email apache-camel pooling

使用apache camel,使用Polling使用者,在轮询我的邮件时标记为已读。

options : delete=false&peek=false&unseen=true

轮询后,当我处理附件时,如果发生任何错误,我想将邮件设为“未读”。所以我以后可以再次聚集。

public void process(Exchange exchange) throws Exception {
    Map<String, DataHandler> attachments = exchange.getIn().getAttachments();

    Message messageCopy = exchange.getIn().copy();

    if (messageCopy.getAttachments().size() > 0) {
        for (Map.Entry<String, DataHandler> entry : messageCopy.getAttachments().entrySet()) {

            DataHandler dHandler = entry.getValue();

            // get the file name
            String filename = dHandler.getName();

            // get the content and convert it to byte[]
            byte[] data =
                    exchange.getContext().getTypeConverter().convertTo(byte[].class, dHandler.getInputStream());

            log.info("Downloading attachment, file name : " + filename);
            InputStream fileInputStream = new ByteArrayInputStream(data);
            try {
                // Processing attachments
                // if any error occurs here, i want to make the mail mark as unread
            } catch (Exception e) {
                log.info(e.getMessage());
            }
        }
    }
}

我注意到选项peek,通过将其设置为true,在轮询期间不会使邮件标记为已读,在这种情况下是否有任何选项可以使标记为已读处理后。

1 个答案:

答案 0 :(得分:1)

要获得您想要的结果,您应该有选项

peek=true&unseen=true

peek = true 选项应该确保邮件在邮件服务器上保持准确状态,就像轮询之前一样,即使存在异常也是如此。但是,目前它不会起作用。这实际上是Camel Mail组件中的一个错误。我已经向https://issues.apache.org/jira/browse/CAMEL-9106提交了一个补丁,这可能会在将来的版本中修复。

作为一种解决方法,您可以设置 mapMailMessages = false ,但之后您必须自己处理电子邮件内容。在Camel 2.15之后,你还有 postProcessAction 选项,你可以从处理错误的消息中删除SEEN标志。不过,我建议等待修复。