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

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文件)来搞定,步骤如下:

  1. 引入依赖
    先在项目里添加Apache POI Scratchpad的依赖(Maven为例):

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>5.2.5</version> <!-- 建议用最新稳定版 -->
    </dependency>
    
  2. 修改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);
                    // 其他业务逻辑...
                }
            });
    }
    
  3. 处理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);
      

额外提示

  • 记得用try-with-resources语法自动关闭输入流,避免资源泄漏
  • 如果还是有乱码,可以试试换成Windows-1252编码(Outlook常用的编码)
  • 要是需要处理附件,HSMF也能帮你提取附件内容,按需扩展就行

内容的提问来源于stack exchange,提问作者Shamim Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:31