我正在使用Apache Camel 2.22.0,并且有一条简单的路由发送电子邮件(带有一些属性引用):
public class EmailFailureRoute extends RouteBuilder {
@Override
public void configure() {
from("seda:mail")
.setHeader("To", simple("{{mail.failure.to}}"))
.setHeader("From", simple("{{mail.failure.from}}"))
.setHeader("Subject", constant("TEST!"))
.to("velocity://templates/failure-mail.vm")
.to("{{mail.smtpServer}}");
}
}
我希望得到的是一封普通的电子邮件,其中包含来自邮件正文中的Velocity模板的文本。我实际上得到的是一封电子邮件,其中带有来自Velocity模板的文本附加到该电子邮件。在MS Outlook中看起来像这样:
为什么附件?如何获得邮件组件以将Velocity模板的结果直接插入到电子邮件正文中?
更新:
通过打开邮件组件上的“ debugMode”标志,我可以看到实际电子邮件的内容,该电子邮件正被发送到SMTP服务器。看来我的问题是Content-Type为'application / json'!因此,现在可以连接主体了,但是我不知道为什么以这种方式设置Content-Type。即使在邮件端点上设置查询参数'contentType = text / plain'也不会影响电子邮件的最终Content-Type。
答案 0 :(得分:1)
虽然我仍然不太真正了解这里发生的事情,但我确实有一个可行的解决方案。我要更改电子邮件内容类型的唯一方法是在路由到邮件端点之前在骆驼消息上设置“ Content-Type”标头:
.setHeader("Content-Type", constant("text/plain"))
我什至无法通过使用邮件组件上的“ contentType”查询参数来更改内容类型。
答案 1 :(得分:0)
您最近好吗,经历了类似的事情,并通过以下方式解决了问题,希望对您有所帮助
@Handler
public void attachmentValidate(@ExchangeProperty("MAIL_ATTACHMENTS") List<Attachment> attachments,
Exchange exchange) throws Exception {
Message in = exchange.getIn();
if (attachments != null) {
for (Attachment attachment : attachments) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor(attachment.getName()
.substring(attachment.getName().indexOf('.'), attachment.getName().length()));
if (StringUtils.isEmpty(mimeType)) {
mimeType = "application/octet-stream";
}
byte[] decoded = Base64.getDecoder().decode(attachment.getValue());
in.addAttachment(attachment.getName(), new DataHandler(new ByteArrayDataSource(decoded, mimeType)));
}
}
exchange.setProperty("MAIL_ATTACHMENTS", attachments);
}