Apache Camel路由读取.msg邮件文件时遇无效字符求助
解决.msg邮件文件读取时的无效字符问题
嘿,我完全懂你现在的困扰——直接把.msg文件的Body转成String肯定会出现乱码或者莫名其妙的无效字符,因为.msg是Outlook专属的二进制邮件格式,可不是纯文本文件,直接硬转字符串就相当于把一堆二进制字节强行套成文本,不出问题才怪呢!
问题根源
你的Camel路由里用exchange.getIn().getBody(String.class)直接读取.msg内容,这完全搞错了处理逻辑。.msg文件里封装了邮件的所有结构(正文、附件、元数据等),必须用专门的解析库才能正确提取出可读的邮件正文。
解决方案:用Apache POI HSMF解析.msg文件
我推荐用Apache POI的HSMF模块(专门处理Outlook .msg文件)来搞定,步骤如下:
引入依赖
先在项目里添加Apache POI Scratchpad的依赖(Maven为例):<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>5.2.5</version> <!-- 建议用最新稳定版 --> </dependency>修改Camel Processor代码
把原来直接转String的逻辑改成用HSMF解析输入流:@Override public void configure() throws Exception { from(SOURCE_PATH) .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { final EmailResponseModel erm = new EmailResponseModel(); // 获取.msg文件的输入流(别直接转String!) InputStream msgInputStream = exchange.getIn().getBody(InputStream.class); if (msgInputStream != null) { try (MAPIMessage msg = new MAPIMessage(msgInputStream)) { // 获取纯文本正文,如果需要HTML正文可以用getHtmlBody() String rawContent = msg.getTextBody(); // 处理编码转换,避免乱码 String emailContent = rawContent != null ? new String(rawContent.getBytes("ISO-8859-1"), "UTF-8") : ""; erm.setEmail(emailContent); } catch (IOException e) { throw new RuntimeException("解析.msg文件失败", e); } } exchange.getIn().setBody(erm, DBObject.class); // 其他业务逻辑... } }); }处理RTF格式的正文
如果你的.msg邮件正文是RTF格式的,上面的getTextBody()可能会返回带RTF标记的内容,这时候可以用Apache Tika来自动提取纯文本:- 先添加Tika依赖:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.9.1</version> </dependency> - 修改解析逻辑:
Tika tika = new Tika(); String emailContent = tika.parseToString(msgInputStream); erm.setEmail(emailContent);
- 先添加Tika依赖:
额外提示
- 记得用try-with-resources语法自动关闭输入流,避免资源泄漏
- 如果还是有乱码,可以试试换成
Windows-1252编码(Outlook常用的编码) - 要是需要处理附件,HSMF也能帮你提取附件内容,按需扩展就行
内容的提问来源于stack exchange,提问作者Shamim Ahmad
相关产品推荐
相关产品推荐

