如何在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
相关产品推荐
相关产品推荐

