如何强制Keycloak文本MIME部分使用quoted-printable编码?
解决Keycloak 15.0.2邮件文本部分7bit编码导致的RFC合规问题
方法一:修改核心邮件发送代码
Keycloak构建MIME邮件的核心类为org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider,需修改文本部分的编码设置:
- 找到类中创建文本
MimeBodyPart的代码块,在实例化后添加:bodyPart.setHeader("Content-Transfer-Encoding", "quoted-printable"); - 重新编译替换
keycloak-email-freemarker-15.0.2.jar,重启Keycloak。
方法二:自定义扩展覆盖邮件模板提供者
无需修改核心源码,通过扩展实现编码强制:
- 编写自定义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; } } - 在
META-INF/services/org.keycloak.email.EmailTemplateProvider文件中写入自定义类的全限定名。 - 打包为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
相关产品推荐
相关产品推荐

