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

Jakarta Mail在Tomcat环境下主题emoji显示异常问题

解决Jakarta Mail在Tomcat中发送邮件主题Emoji显示问号的问题

这个问题核心是Tomcat运行环境的默认字符编码和本地main方法环境不一致,加上Jakarta Mail默认依赖平台编码处理主题,导致Emoji被错误转码成问号。下面是实测有效的解决步骤:

  • 强制指定邮件主题的编码
    不要依赖setSubject的默认行为,调用方法时明确传入UTF-8编码:

    // 直接用Emoji或Unicode转义写法均可
    message.setSubject("系统告警🚨", "UTF-8");
    // 或者用你原来的Unicode写法
    message.setSubject("系统告警\uD83D\uDEA8", "UTF-8");
    

    这样不管平台默认编码是什么,主题都会用UTF-8编码处理,避免Emoji被截断或转码。

  • 修改Tomcat的默认字符编码
    Tomcat默认可能用ISO-8859-1或其他编码作为系统默认,和本地开发环境的UTF-8不一致。修改Tomcat启动脚本:

    • Linux/macOS:编辑catalina.sh,在文件开头添加:
      JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
      
    • Windows:编辑catalina.bat,添加:
      set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
      

    重启Tomcat后,系统默认编码会和本地main方法运行环境对齐为UTF-8。

  • 配置Jakarta Mail会话的编码属性
    在创建邮件会话时,添加编码相关属性,强制整个邮件流程使用UTF-8:

    Properties mailProps = new Properties();
    // SMTP基础配置
    mailProps.put("mail.smtp.host", "smtp.gmail.com");
    mailProps.put("mail.smtp.port", "587");
    mailProps.put("mail.smtp.auth", "true");
    mailProps.put("mail.smtp.starttls.enable", "true");
    // 关键编码配置
    mailProps.put("mail.smtp.charset", "UTF-8");
    mailProps.put("mail.mime.charset", "UTF-8");
    
    Session session = Session.getInstance(mailProps, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("your-gmail@xxx.com", "your-app-password");
        }
    });
    
  • 手动编码主题(终极方案)
    如果上面的方法都无效,直接用MimeUtility对主题进行Base64编码,确保传输过程中编码不丢失:

    String subject = "系统告警\uD83D\uDEA8";
    String encodedSubject = MimeUtility.encodeText(subject, "UTF-8", "B");
    message.setSubject(encodedSubject);
    

    这种方式会把主题转换成符合MIME标准的编码格式,邮件客户端解码后能正确显示Emoji。

内容的提问来源于stack exchange,提问作者Francesco Galvão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:42:37