You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apache Camel中正确配置带空文本与XML附件的多部分邮件?

解决Apache Camel发送含空文本与XML附件的多部分邮件问题

错误原因

你当前的实现直接将MimeMultipart设为消息体并手动指定Content-Type,这会干扰Camel邮件组件的自动处理逻辑,导致邮件的边界标识(boundary)无法正确生成或被识别,进而触发"Missing start boundary"错误。

正确配置方案

方案一:利用Camel邮件组件的原生附件支持

Camel的SMTP组件原生支持处理邮件正文与附件,无需手动构建MimeMultipart,组件会自动生成正确的multipart结构和边界:

import org.apache.camel.Attachment;
import org.apache.camel.DefaultAttachment;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

@Override
public void configure() {
    from("direct:example")
            .process(exchange -> {
                // 设置邮件头部信息
                exchange.getIn().setHeader("from", "me");
                exchange.getIn().setHeader("to", "you");
                exchange.getIn().setHeader("subject", "subject");
                
                // 设置空文本作为邮件正文
                exchange.getIn().setBody("", "text/plain; charset=UTF-8");
                
                // 添加XML内容作为附件,指定对应Content-Type
                Attachment xmlAttachment = new DefaultAttachment(
                    "soap-content.xml", 
                    "application/soap+xml; charset=UTF-8", 
                    new ByteArrayInputStream("<tag/>".getBytes(StandardCharsets.UTF_8))
                );
                exchange.getIn().addAttachment("soap-content", xmlAttachment);
            })
            .to("smtp://connectionString");
}

方案二:手动构建完整的MimeMessage

如果需要完全自定义multipart结构,可以直接构建MimeMessage并设置为消息体,让Camel直接发送该消息,避免组件的自动处理:

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

@Override
public void configure() {
    from("direct:example")
            .process(exchange -> {
                // 获取JavaMail Session(可复用Camel配置的Session,或手动创建)
                Session session = Session.getDefaultInstance(new Properties());
                
                // 构建完整MimeMessage
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress("me"));
                message.setRecipient(Message.RecipientType.TO, new InternetAddress("you"));
                message.setSubject("subject", "UTF-8");
                
                // 创建multipart容器
                MimeMultipart multipart = new MimeMultipart("mixed");
                
                // 添加空文本部分
                MimeBodyPart textPart = new MimeBodyPart();
                textPart.setText("", "UTF-8");
                multipart.addBodyPart(textPart);
                
                // 添加XML内容部分
                MimeBodyPart xmlPart = new MimeBodyPart();
                xmlPart.setContent("<tag/>", "application/soap+xml; charset=UTF-8");
                multipart.addBodyPart(xmlPart);
                
                // 将multipart设为邮件内容
                message.setContent(multipart);
                
                // 将MimeMessage设置为Exchange的消息体
                exchange.getIn().setBody(message);
            })
            .to("smtp://connectionString");
}

关键注意事项

  • 避免手动设置Exchange.CONTENT_TYPE头部,Camel邮件组件会根据消息体自动处理该头部,手动设置会破坏组件的自动逻辑。
  • 使用MimeMessage作为消息体时,Camel会直接发送该消息,不会再修改内容,因此需要确保所有头部和multipart结构都配置正确。

内容的提问来源于stack exchange,提问作者Georg Braun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:03:10