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

如何强制Keycloak文本MIME部分使用quoted-printable编码?

解决Keycloak 15.0.2邮件文本部分7bit编码导致的RFC合规问题

方法一:修改核心邮件发送代码

Keycloak构建MIME邮件的核心类为org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider,需修改文本部分的编码设置:

  1. 找到类中创建文本MimeBodyPart的代码块,在实例化后添加:
    bodyPart.setHeader("Content-Transfer-Encoding", "quoted-printable");
    
  2. 重新编译替换keycloak-email-freemarker-15.0.2.jar,重启Keycloak。

方法二:自定义扩展覆盖邮件模板提供者

无需修改核心源码,通过扩展实现编码强制:

  1. 编写自定义Provider类,继承FreeMarkerEmailTemplateProvider并重写文本部分创建方法:
    public class CustomEmailTemplateProvider extends FreeMarkerEmailTemplateProvider {
        public CustomEmailTemplateProvider(KeycloakSession session) {
            super(session);
        }
    
        @Override
        protected MimeBodyPart createTextPart(String text, String charset) throws MessagingException {
            MimeBodyPart part = super.createTextPart(text, charset);
            part.setHeader("Content-Transfer-Encoding", "quoted-printable");
            return part;
        }
    }
    
  2. 在META-INF/services/org.keycloak.email.EmailTemplateProvider文件中写入自定义类的全限定名。
  3. 打包为jar放入Keycloak的providers目录,重启服务。

方法三:模板层面临时处理(快速 workaround)

在验证邮件的文本模板email/verify-email.ftl中,对长链接做软换行处理:

${link?replace("(.{70})", "$1 ", "r")}

此方法会每70字符添加一个空格,触发邮件客户端自动软换行,避免行过长问题,但属于临时方案,不如前两种彻底。

背景说明

Keycloak默认根据文本内容自动选择编码,当文本无特殊字符且行未达内部阈值时会用7bit编码。但JWT验证链接长度远超RFC 2822规定的78字符限制,必须强制使用quoted-printable编码让系统自动分割长行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:43:03