217.15. 使用附加示例消耗邮件

在该示例中,我们轮询一个邮箱,并将邮件中的所有附件存储为文件。首先,我们将定义一个路由来轮询邮箱。如本示例基于 google 邮件,它使用与 SSL 示例中所示相同的路由:

from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
    + "&delete=false&unseen=true&consumer.delay=60000").process(new MyMailProcessor());

我们使用可以从 java 代码处理邮件的处理器,而不是记录以下邮件:

    public void process(Exchange exchange) throws Exception {
        // the API is a bit clunky so we need to loop
        Map<String, DataHandler> attachments = exchange.getIn().getAttachments();
        if (attachments.size() > 0) {
            for (String name : attachments.keySet()) {
                DataHandler dh = attachments.get(name);
                // get the file name
                String filename = dh.getName();

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

                // write the data to a file
                FileOutputStream out = new FileOutputStream(filename);
                out.write(data);
                out.flush();
                out.close();
            }
        }
   }

如您所见到处理附件的 API 是一个位线,但这样您就可以得到 javax.activation.DataHandler,因此您可以使用标准 API 处理附件。