简体   繁体   English

使用Apache骆驼下载邮件附件时出错

[英]Error downloading mail attachments with apache camel

I'm working in an apache camel project that download any attachment in the inbox, to achieve that I followed the information in the Consuming mails with attachment sample from http://camel.apache.org/mail.html . 我正在一个apache骆驼项目中工作,该项目可以下载收件箱中的所有附件,以实现我遵循了http://camel.apache.org/mail.html中带有附件的消费邮件中的信息。 That works pretty well except when the attachment has a filename with special characters or spaces. 除非附件中的文件名带有特殊字符或空格,否则效果很好。 For example if the attachment has a filename like " voucher.pdf " the program works and downloads the file, but if it has a filename like " Pase de abordar en línea (1).pdf " I get this error: 例如,如果附件的文件名类似于“ voucher.pdf ”,则程序可以工作并下载文件,但是如果文件名的文件名为Pase de abordar enlínea(1).pdf ”, 则会出现此错误:

Message History --------------------------------------------------------------------------------------------------------------------------------------- RouteId ProcessorId Processor 邮件记录------------------------------------------------ -------------------------------------------------- ------------------------------------- RouteId ProcessorId处理器
Elapsed (ms) [route1 ] [route1 ] [imaps://imap.gmail.com:993?consumer.delay=60000&contentType=multipart%2FMIXED&] [ 2576] [route1 ] [convertBodyTo1 ] [convertBodyTo[java.lang.String] 经过的时间(毫秒)[route1] [route1] [imaps://imap.gmail.com:993?consumer.delay = 60000&contentType = multipart%2FMIXED&] [2576] [route1] [convertBodyTo1] [convertBodyTo [java.lang.String ]
] [ 642] [route1 ] [process1 ] [Processor@0x13e344d ] [642] [route1] [process1] [Processor @ 0x13e344d
] [ 1903] [route1 ] [to1 ] [file:C:/outputFolder/?flatten=true&fileName=${header.nombref} ] [1903] [route1] [to1] [file:C:/ outputFolder /?flatten = true&fileName = $ {header.nombref}
] [ 8] ] [8]

Stacktrace --------------------------------------------------------------------------------------------------------------------------------------- org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: C:\\outputFolder\\=?UTF-8?Q?Pase_de_abordar_en_l=C3=ADnea_(1).pdf?= at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:344) at org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277) at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165) at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:79) at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) at org.apache.came 堆栈跟踪 - - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------------- ------------------------------------ org.apache.camel.component.file.GenericFileOperationFailedException:无法存储文件:C:\\ outputFolder \\ =?UTF-8?Q?Pase_de_abordar_en_l = C3 = ADnea_(1).pdf?= org.org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:344) org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165)的.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277)org.apache.camel.component.file org.apache.camel.util.AsyncProcessorConverterHelper $ ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)的.GenericFileProducer.process(GenericFileProducer.java:79)在org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) )在org.apache.came的org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) l.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) at org.apache.camel.component.mail.MailConsumer.processExchange(MailConsumer.java:392) at org.apache.camel.component.mail.MailConsumer.processBatch(MailConsumer.java:221) at org.apache.camel.component.mail.MailConsumer.poll(MailConsumer.java:128) at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175) at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurren org.apache.camel.processor.Pipeline.process(Pipeline.java :)的org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)的l.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) 120)位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83)位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)位于org.apache.camel.processor.DelegateAsyncProcessor org.apache.camel.component.mail.MailConsumer.processExchange(MailConsumer.java:392)的.process(DelegateAsyncProcessor.java:97)org.apache.camel.component.mail.MailConsumer.processBatch(MailConsumer.java:221) )的org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)的org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)的org.apache.camel.impl。 ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)at java.util.concurren t.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.FileNotFoundException: C:\\outputFolder\\=?UTF-8?Q?Pase_de_abordar_en_l=C3=ADnea_(1).pdf?= (El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(FileOutputStream.java:270) at java.io.FileOutputStream.(FileOutputStream.java:213) at java.io.FileOutputStream.(FileOutputStream.java:162) at org.apache.camel.component.file.FileOperations.prepareOutputFileChannel(Fi java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:180)处的t.FutureTask.runAndReset(FutureTask.java:308)在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run:294。 )的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)的java.lang.Thread.run(Thread.java: 745)原因:java.io.FileNotFoundException:C:\\ outputFolder \\ =?UTF-8?Q?Pase_de_abordar_en_l = C3 = ADnea_(1).pdf?=(El nombre de archivo,el nombre de Directorio o la sintaxis de语法上的错误,无java.io.FileOutputStream.open0(本机方法)的java.io.FileOutputStream.open(FileOutputStream.java:270)的java.io.FileOutputStream。(FileOutputStream.java:213)的org.apache.camel.component.file.FileOperations.prepareOutputFileChannel(Fi)上的java.io.FileOutputStream。(FileOutputStream.java:162) leOperations.java:505) at org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:444) at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:326) ... 24 more 7209 [Camel (camel-1) thread #0 - imaps://imap.gmail.com:993] DEBUG org.apache.camel.processor.Pipeline - Message exchange has failed: so breaking out of pipeline for exchange: Exchange[ID-desarrollo01-59804-1524233458774-0-2] Exception: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: C:\\outputFolder\\=?UTF-8?Q?Pase_de_abordar_en_l=C3=ADnea_(1).pdf?= 7209 [Camel (camel-1) thread #0 - imaps://imap.gmail.com:993] WARN org.apache.camel.component.mail.MailConsumer - Exchange failed, so rolling back message status: Exchange[ID-desarrollo01-59804-1524233458774-0-2] org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: C:\\outputFolder\\=?UTF-8?Q?Pase_de_abordar_en_l=C3=ADnea_(1).pdf?= at org.apache.camel.componen org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:444)的leOperations.java:505)org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:326)的leOperations.java:505)。 。24更多7209 [Camel(camel-1)线程#0-imaps://imap.gmail.com:993]调试org.apache.camel.processor.Pipeline-消息交换失败:因此中断了交换管道:Exchange [ID-desarrollo01-59804-1524233458774-0-2]异常:org.apache.camel.component.file.GenericFileOperationFailedException:无法存储文件:C:\\ outputFolder \\ =?UTF-8?Q?Pase_de_abordar_en_l = C3 = ADnea_(1).pdf?= 7209 [Camel(camel-1)线程#0-imaps://imap.gmail.com:993] WARN org.apache.camel.component.mail.MailConsumer-交换失败,因此滚动返回消息状态:Exchange [ID-desarrollo01-59804-1524233458774-0-2] org.apache.camel.component.file.GenericFileOperationFailedException:无法存储文件:C:\\ outputFolder \\ =?UTF-8?Q?Pase_de_abordar_en_l = C3 = org.apache.camel.componen上的= ADnea_(1).pdf?= t.file.FileOperations.storeFile(FileOperations.java:344) at org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277) at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165) at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:79) at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) at org.apache.camel.processo 位于org.apache.camel.component.file.GenericFileProducer.processExchange(org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277)的t.file.FileOperations.storeFile(FileOperations.java:344) org.apache.camel.component.file.GenericFileProducer.java(165)在org.apache.camel.util.AsyncProcessorConverterHelper $ ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)在org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:79) org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)的.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler .java:542)位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)位于org.apache.camel.processor.Pipeline.process(Pipeline.java:120)位于org.apache.camel。 org.apache.camel.processo上的processor.Pipeline.process(Pipeline.java:83) r.CamelInternalProcessor.process(CamelInternalProcessor.java:197) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) at org.apache.camel.component.mail.MailConsumer.processExchange(MailConsumer.java:392) at org.apache.camel.component.mail.MailConsumer.processBatch(MailConsumer.java:221) at org.apache.camel.component.mail.MailConsumer.poll(MailConsumer.java:128) at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175) at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWo org.apache.camel.component.mail.MailConsumer.processExchange(MailConsumer.java :)上的org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)上的r.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 392)在org.apache.camel.component.mail.MailConsumer.poll(MailConsumer.java:128)在org.apache.camel.component.mail.MailConsumer.poll(MailConsumer.java:128)在org.apache.camel org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)的.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) )处java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:180)处java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.runAndReset(FutureTask.java:308)在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFuture (ScheduledThreadPoolExecutor.java:294)在java.util.concurrent.ThreadPoolExecutor.runWo rker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.FileNotFoundException: C:\\outputFolder\\=?UTF-8?Q?Pase_de_abordar_en_l=C3=ADnea_(1).pdf?= (El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(FileOutputStream.java:270) at java.io.FileOutputStream.(FileOutputStream.java:213) at java.io.FileOutputStream.(FileOutputStream.java:162) at org.apache.camel.component.file.FileOperations.prepareOutputFileChannel(FileOperations.java:505) at org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:444) at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:326) ... 24 more rker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)原因:java.io.FileNotFoundException :C:\\ outputFolder \\ =?UTF-8?Q?Pase_de_abordar_en_l = C3 = ADnea_(1).pdf?=(El nombre de archivo,el nombre de Directorio o la sintaxis de la etiqueta del volumen no son Correctos)在Java .io.FileOutputStream.open0(本机方法),位于java.io.FileOutputStream.open(FileOutputStream.java:270),位于java.io.FileOutputStream。(FileOutputStream.java:213),位于java.io.FileOutputStream。(FileOutputStream.java :162),位于org.apache.camel.component.file.FileOperations.prepareOutputFileChannel(FileOperations.java:505),位于org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:444)。 camel.component.file.FileOperations.storeFile(FileOperations.java:326)...还有24个

This is my main method: 这是我的主要方法:

public class Main {

    public static void main(String[] args) throws FileNotFoundException {

        KeyStoreParameters ksp = new KeyStoreParameters();
        ksp.setResource("C://Program Files (x86)//Java//jre1.8.0_161//lib//security");
        ksp.setPassword("changeit");

        KeyManagersParameters kmp = new KeyManagersParameters();
        kmp.setKeyStore(ksp);
        kmp.setKeyPassword("changeit");

        SSLContextParameters scp = new SSLContextParameters();
        scp.setKeyManagers(kmp);        


        BasicConfigurator.configure();
        RutaMail routeBuilder = new RutaMail();

        SimpleRegistry jndi= new SimpleRegistry();
        jndi.put("keystore", scp);              

        CamelContext ctx = new DefaultCamelContext(jndi);





        try {

            ctx.addRoutes(routeBuilder);
            ctx.start();
            Thread.sleep(30000);
            ctx.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

This is the camel route: 这是骆驼路线:

public void configure() throws Exception {

        from("imaps://imap.gmail.com:993?username=user@gmail.com&password=password"
                + "&delete=false&unseen=true&consumer.delay=60000&contentType=multipart/MIXED")
                        .convertBodyTo(String.class, "UTF-8")
                        .process(new MailProcessor())

                        .to("file:C:/outputFolder/?flatten=true&fileName=${header.nombref}")
                        .log("el nombre del archivo es  ${header.nombref}").end();
    }

}

This is the processor: 这是处理器:

public class MailProcessor implements Processor {

    public void process(Exchange exchange) throws Exception {
                String nombre="";


        // the API is a bit clunky so we need to loop
        Map<String, DataHandler> attachments = exchange.getIn().getAttachments();

        String file="";

        if (attachments.size() > 0) {
            for (String name : attachments.keySet()) {                


                DataHandler dh = attachments.get(name);

                String filename =dh.getName();
                nombre =filename;


                byte[] data = exchange.getContext().getTypeConverter()
                                  .convertTo(byte[].class, dh.getInputStream());                                             

                exchange.getIn().setBody( data);
                exchange.getIn().setHeader("nombref", filename);
            }          


        }
   }

}

Thanks for your help. 谢谢你的帮助。

似乎您的操作系统不允许使用该名称保存文件。

I believe you are using the 'file' component incorrectly. 我相信您使用的“文件”组件不正确。 You need to add // after URI name. 您需要在URI名称后添加//。 Try with file://C:/outputFolder/?flatten=true&fileName=${header.nombref and let me know. 尝试使用file:// C:/ outputFolder /?flatten = true&fileName = $ {header.nombref,让我知道。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM