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