Java 为什么Apache骆驼邮件组件将正文作为附件发送?

Java 为什么Apache骆驼邮件组件将正文作为附件发送?,java,apache-camel,Java,Apache Camel,我使用的是Apache Camel 2.22.0,有一个简单的发送电子邮件的路径(带有一些属性引用): 我希望得到的是一封普通电子邮件,邮件正文中包含Velocity模板中的文本。我实际上收到的是一封电子邮件,邮件中附有Velocity模板中的文本。在MS Outlook中看起来是这样的: 为什么是附件?如何让邮件组件将Velocity模板的结果直接插入电子邮件正文 更新: 通过打开邮件组件上的“debugMode”标志,我能够看到实际电子邮件发送到SMTP服务器时的内容。看来我的问题是内容类

我使用的是Apache Camel 2.22.0,有一个简单的发送电子邮件的路径(带有一些属性引用):

我希望得到的是一封普通电子邮件,邮件正文中包含Velocity模板中的文本。我实际上收到的是一封电子邮件,邮件中附有Velocity模板中的文本。在MS Outlook中看起来是这样的:

为什么是附件?如何让邮件组件将Velocity模板的结果直接插入电子邮件正文

更新:


通过打开邮件组件上的“debugMode”标志,我能够看到实际电子邮件发送到SMTP服务器时的内容。看来我的问题是内容类型是“application/json”!所以现在有必要附加主体,但我不知道为什么内容类型是这样设置的。即使在邮件端点上设置查询参数“contentType=text/plain”,也不会影响电子邮件的最终内容类型。

虽然我仍然不太明白这里发生了什么,但我有一个可行的解决方案。要更改电子邮件的内容类型,唯一的方法是在发送到邮件端点之前,在驼峰邮件上设置“content type”标题:

.setHeader("Content-Type", constant("text/plain"))

我甚至无法使用邮件组件上的“contentType”查询参数来更改内容类型

你最近怎么样,经历了一些类似的事情,并用下面的方法解决了它,我希望这会有所帮助

@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);
}
处理程序 public void attachmentValidate(@ExchangeProperty(“邮件附件”)列表附件, Exchange)引发异常{ Message in=exchange.getIn(); 如果(附件!=null){ 用于(附件:附件){ FileNameMap FileNameMap=URLConnection.getFileNameMap(); 字符串mimeType=fileNameMap.getContentTypeFor(附件.getName() .substring(attachment.getName().indexOf('.')、attachment.getName().length()); if(StringUtils.isEmpty(mimeType)){ mimeType=“应用程序/八位字节流”; } 字节[]decoded=Base64.getDecoder().decode(附件.getValue()); 在.addAttachment(attachment.getName(),新的数据处理程序(新的ByteArrayDataSource(已解码,mimeType)); } } exchange.setProperty(“邮件附件”,附件); }
您的邮件是纯文本的吗?还是html?Outlook对内容尤其固执。你能把邮件发送到Gmail帐户并检查一下吗。为了让Outlook通过ApacheCammel邮件组件正确地显示图像,我不得不跳转。MS有自己在Outlook中处理邮件的方法。邮件组件默认使用MIME类型text/plain,尽管我尝试了text/plain和text/html,但结果相同。我还试着将邮件发送到GMail账户,但邮件中仍然有一个附件,而不是正文。是的,就像我说的,有一些困难需要解决。我必须在邮件(html正文)中插入图像,而且还有很多额外的设置。应该在事后的某个地方写下来。
@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);
}