如何用Apache Camel aws2-ses组件发送带附件的RawMessage邮件?
解决Apache Camel aws2-ses组件发送带附件Raw邮件的问题
1. 显式指定sendRawEmail操作
aws2-ses组件默认执行sendEmail操作,必须显式指定触发sendRawEmail:
- 在路由URI中添加
operation=sendRawEmail参数 - 或者在消息头设置
CamelAwsSesOperation为sendRawEmail
示例路由配置:
from("direct:sendRawMail") .to("aws2-ses://default?operation=sendRawEmail®ion=us-east-1");
2. 正确构造消息体格式
组件不接受直接传递RawMessage对象,需将MIME消息字节数组转为Base64字符串后作为消息体:
// 生成包含HTML内容和PDF附件的MIME消息 MimeMessage mimeMsg = buildMimeMessageWithAttachment(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMsg.writeTo(baos); byte[] mimeBytes = baos.toByteArray(); // 转Base64字符串作为Camel消息体 String base64Content = Base64.getEncoder().encodeToString(mimeBytes); exchange.getIn().setBody(base64Content); // 设置必填邮箱头 exchange.getIn().setHeader("CamelAwsSesSource", "verified-sender@yourdomain.com"); exchange.getIn().setHeader("CamelAwsSesDestinations", List.of("verified-recipient@yourdomain.com"));
3. 适配SES沙箱限制
沙箱环境下必须保证:
- 发件人和收件人均为AWS控制台验证通过的邮箱
- 不能发送给未验证的邮箱地址,否则会被拦截
4. 备选方案:直接调用SES v2客户端
如果组件仍无法正常工作,可直接注入SesClient调用原生API:
@Autowired private SesClient sesClient; public void sendRawMailDirect(byte[] mimeBytes) { RawMessage rawMsg = RawMessage.builder() .data(SdkBytes.fromByteArray(mimeBytes)) .build(); SendRawEmailRequest req = SendRawEmailRequest.builder() .rawMessage(rawMsg) .source("verified-sender@yourdomain.com") .destinations("verified-recipient@yourdomain.com") .build(); sesClient.sendRawEmail(req); }
排查要点
- 检查消息头
CamelAwsSesOperation是否正确设置为sendRawEmail - 确认Base64编码无多余换行或空格
- 开启Camel DEBUG日志,查看组件实际发送的请求内容
内容的提问来源于stack exchange,提问作者rabitem
相关产品推荐
相关产品推荐

