当前位置: 首页 > 知识库问答 >
问题:

为什么Apache Camel邮件组件将正文作为附件发送?

颜修明
2023-03-14

我正在使用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模板的结果直接插入到电子邮件正文中?

更新:

通过打开邮件组件上的“调试模式”标志,我能够看到发送到SMTP服务器的实际电子邮件的内容。我的问题似乎是内容类型是“应用程序/json”!所以现在附加正文是有意义的,但我不知道为什么这样设置内容类型。即使在邮件终端上设置查询参数“内容类型=文本/普通”也对电子邮件消息的最终内容类型没有影响。

共有2个答案

梅修贤
2023-03-14

你最近怎么样,经历了类似的事情,并通过以下方式解决了它,希望对你有所帮助

@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);
}
桂丰
2023-03-14

虽然我仍然不明白这里发生了什么,但我确实有一个可行的解决方案。我更改电子邮件内容类型的唯一方法是在路由到邮件endpoint之前在 Camel 邮件上设置“内容类型”标头:

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

我甚至无法通过在邮件组件上使用'ContentType'查询参数来更改内容类型。

 类似资料:
  • 问题内容: 我的输入文件是一个CSV文件,通过运行一些包含python Tabulate模块的python脚本,我创建了一个如下表: tabulate_output 或 我想将此表发送到电子邮件正文中,而 不是 使用python 作为 附件发送 。 我已经创建了sendMail函数,并且期望在mail_body中发送表。 问题答案: 此代码以典型的纯文本格式以及html multipart / a

  • 我想用mailto标签发送电子邮件,附带一个pdf文件作为附件。mailto标记使用以下方法打开邮件窗口,其中包含传递的参数,如to和subject: 但是,附件作为一个参数不起作用。请建议如何在手机中发送pdf附件。 谢啦

  • 我试图在javamail API的帮助下发送两个附件,但发件人正在接收附件作为转发消息传递给发件人的邮件。我也看不到邮件中的正文。我正在向outlook的电子邮件客户端发送邮件。它类似的附件在同一封邮件中以独立邮件的形式出现,当我点击邮件中的独立邮件时,它会显示附件。就像我在同一封邮件中打开了另一封邮件一样。谁能检查一下我做错了什么吗 下面是代码 我只想让发件人在一个窗口中接收附件。

  • 我在网上看到了很多代码,但它们似乎都遇到了问题。 使用以下功能创建并保存文件: 然而,当运行下面的代码来发送文件时,我一直遇到问题,并建议使用此链接的所有答案https://stackoverflow.com/questions/48117511/exposed-beyond-app-through-clipdata-item-geturi,当打开Gmail时,它说无法附加文件 如果有任何方法可以

  • 问题内容: 我创建了一个脚本,该脚本每天晚上在Linux服务器上运行,该脚本用于将每个MySQL数据库备份到.sql文件,并将它们打包为压缩的.tar文件。我要完成的下一步是通过电子邮件将该tar文件发送到远程电子邮件服务器以进行保管。我可以通过管道备份文本文件来向正文中的原始脚本发送电子邮件,如下所示: 回显备份文件的文本,该文本将通过收件人的电子邮件地址作为参数传递到程序中。 虽然可以满足我的

  • 我也遇到了一个问题,而发送邮件正文的日语。 我使用了mimeutility.encodeText(subject,“UTF-8”,“B”),但这只适用于subject而不适用于邮件正文中的日语文本。 我正在使用阿帕奇骆驼邮件。 请帮忙