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