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

kgqe7b3p  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(164)

我用的是apache camel,有轮询功能,轮询时我的邮件被标记为已读。

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,它将不会使邮件标记为已读在轮询期间,在这种情况下,有任何选项,使其标记为已读处理后.

np8igboo

np8igboo1#

为了得到你想要的结果,你应该有选择

peek=true&unseen=true

peek=true选项是为了确保邮件在轮询前保持在邮件服务器上的状态,即使有异常也是如此。但是,目前它不起作用。这实际上是Camel Mail组件中的一个bug。我已经提交了https://issues.apache.org/jira/browse/CAMEL-9106的补丁,这个问题可能会在未来的版本中得到修复。

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

aiazj4mn

aiazj4mn2#

我们可以用下面的代码设置邮件未读标志

public void process(Exchange exchange) throws Exception {   
  final Message mailMessage = exchange.getIn(MailMessage.class).getMessage();
  mailMessage.setFlag(Flag.SEEN, false);
}

相关问题