Java 如何通过camel-spring DSL将文件作为邮件附件发送

Java 如何通过camel-spring DSL将文件作为邮件附件发送,java,spring,apache-camel,Java,Spring,Apache Camel,我在当前项目中使用Camel 2.9.x进行集成。其中一个路由由两个端点组成—文件轮询端点和smtp邮件端点。第一个终结点生成的文件必须作为附件通过smtp终结点发送 对于Camel配置,我们使用springdsl(这实际上是一个需求)。Spring版本是3.1.1。不幸的是,我只找到了在camel路由中将文件附加到电子邮件的JavaDSL示例和文档 <endpoint uri="file:///path/to" id="file-source"/> <endpoint uri

我在当前项目中使用Camel 2.9.x进行集成。其中一个路由由两个端点组成—文件轮询端点和smtp邮件端点。第一个终结点生成的文件必须作为附件通过smtp终结点发送

对于Camel配置,我们使用springdsl(这实际上是一个需求)。Spring版本是3.1.1。不幸的是,我只找到了在camel路由中将文件附加到电子邮件的JavaDSL示例和文档

<endpoint uri="file:///path/to" id="file-source"/>
<endpoint uri="smtp://mail.example.com:25/?username=someuser@example.com&amp;password=secret&amp;to=recv@example.com" id="mail-dest"/>
<route id="simplified-for-readability">
  <from ref="file-source"/>
  <to ref="mail-dest"/>
</route>

此配置将文件作为纯文本正文发送,而不是作为附件(甚至是二进制文件)。
有没有一种不使用Java dsl而将文件作为附件发送的方法?

这可以通过Spring配置来完成,但您可能需要编写一个简单的Java bean,尽管这与Spring或Java dsl无关

首先创建一个类似于此的类(您可能需要在此处修复这些内容):

然后,只需连接一个SpringBean,并在您的路线中使用它。我们应该做到这一点

<bean id="attacher" class="foo.bar.AttachmentAttacher"/>

<route>
  <from ref="file-source"/>
  <bean ref="attacher"/>
  <to ref="mail-dest"/>
</route>


您可以使用以下表达式执行此操作:。简单是很好的,因为它与骆驼,但我不认为它的强大到足以做到你想要的。我还没有试过,但我确信表达式可以做到这一点。groovy表达式可以在Spring中指定。

这对我来说很有效,与上面的略有不同

import javax.activation.DataHandler;
import javax.mail.util.ByteArrayDataSource;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;

public class AttachmentAttacher implements Processor {

  private final String mimetype;

  public AttachmentAttacher(String mimetype) {
    this.mimetype = mimetype;
  }

  @Override
  public void process(Exchange exchange){
    Message in = exchange.getIn();
    byte[] file = in.getBody(byte[].class);
    String fileId = in.getHeader("CamelFileName",String.class);
    in.addAttachment(fileId, new DataHandler(new     ByteArrayDataSource(file, mimetype)));
  }
}

对我来说,以下代码段在不设置MIME类型的情况下工作:

(当然,您可以根据自己的需要进行调整)


但是,我没有Spring DSL的代码…

好吧,这是我找到的解决方案,但我想用纯XML来实现。如果在纯SpringXML中根本无法做到这一点,那么AttachmentProcessor解决方案是最后的选择。谢谢你的努力。。我不知道如何使用“纯”xml。但是有一种方法可以调用您定义的文件中的脚本(groovy或类似的脚本)(也许可以执行上面“AttachmentAttacher”中的逻辑)。这样,您就可以避免部署已编译的java类。但是它不是Spring/XML。我们可以在邮件组件中添加一些选项,以将文件作为附件发送,诀窍是您可能需要指定mime类型,例如纯文本和文本/二进制(或者二进制内容的名称)。请随时在ASF记录JIRACamel@PetterNordlander有没有提供MIME类型的方法,所以它是text/csv而不是text/plain?沙皇,你得到你所要求的了吗。如果是,请给出一些实现的方向。我也在做同样的事情,但仍然无法弄清楚。@Lucifer这是4年前的事了,spring和camel版本现在已经过时了,而且我真的不记得细节了,除了公认的答案对我有用。你用java dsl代替spring来实现它。我是对的。不,当时没有Java DSL:)它仍然是spring xml配置,我刚刚实现了一个Attacher bean,并用spring xml配置注册了它,就像Petter的回答所建议的那样。非常感谢您的时间。:)
import javax.activation.DataHandler;
import javax.mail.util.ByteArrayDataSource;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;

public class AttachmentAttacher implements Processor {

  private final String mimetype;

  public AttachmentAttacher(String mimetype) {
    this.mimetype = mimetype;
  }

  @Override
  public void process(Exchange exchange){
    Message in = exchange.getIn();
    byte[] file = in.getBody(byte[].class);
    String fileId = in.getHeader("CamelFileName",String.class);
    in.addAttachment(fileId, new DataHandler(new     ByteArrayDataSource(file, mimetype)));
  }
}
public class MyProcesor implements org.apache.camel.Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        String tempDir = System.getProperty("java.io.tmpdir");
        File file = new File(tempDir + "/filename.ext" ); //or wherever you file is located
        exchange.getIn().addAttachment("id", new DataHandler(new FileDataSource(file))); //no explicit MIME-type needed
    }    
}