如何使用MailChimp/Mandrill等外部服务替代KeyCloak内置主题发送邮件?
用外部邮件服务(Mandrill/SendGrid)接管KeyCloak邮件模板的方案
当然有开发者这么做,核心思路是绕开KeyCloak内置的FreeMarker模板渲染,直接调用外部邮件服务的API发送模板化邮件,下面是两种可行的实现方式:
方法一:自定义事件监听器
KeyCloak会触发各类邮件相关事件(比如SEND_VERIFY_EMAIL、SEND_RESET_PASSWORD),你可以写个自定义监听器捕获这些事件,直接调用外部服务API发邮件:
- 编写一个实现
EventListenerProvider的Java类,监听目标事件,提取用户邮箱、验证链接、用户名这些核心参数 - 在监听器里调用Mandrill/SendGrid的模板发送API,传入预先在外部服务中创建好的模板ID,以及提取到的参数
- 把这个类打包成JAR放到KeyCloak的
providers目录,然后在KeyCloak后台启用该监听器,同时关掉内置的邮件发送功能
核心逻辑示例:
public class ExternalEmailListener implements EventListenerProvider { private final MandrillClient mandrillClient; public ExternalEmailListener(MandrillClient mandrillClient) { this.mandrillClient = mandrillClient; } @Override public void onEvent(Event event) { if (EventType.SEND_VERIFY_EMAIL.equals(event.getType())) { String userEmail = event.getDetails().get("email"); String verifyLink = event.getDetails().get("link"); // 调用Mandrill模板发送接口 mandrillClient.sendTemplate("account-verification", Map.of("recipient_email", userEmail, "verify_url", verifyLink)); } else if (EventType.SEND_RESET_PASSWORD.equals(event.getType())) { // 同理处理重置密码邮件 } } // 实现其他必要的接口方法(如close()) }
方法二:替换邮件发送SPI
KeyCloak的邮件发送是基于EmailSenderProvider SPI的,你可以自定义这个SPI的实现,替换默认的SMTP发送逻辑:
- 实现
EmailSenderProvider接口,在send方法里跳过FreeMarker渲染,直接调用外部服务的API - 在项目的
META-INF/services/org.keycloak.email.EmailSenderProvider文件中注册你的实现类 - 打包部署后,KeyCloak会自动使用你的自定义发送器,所有邮件都会走外部服务的模板
注意事项
- 不管用哪种方法,都要在KeyCloak里配置外部服务的API密钥(可以通过后台的自定义属性或
admin-cli添加) - 要覆盖所有需要发送的邮件事件类型,别漏了验证、重置密码、用户邀请这些场景
- 测试时先禁用内置邮件,避免重复发送
内容的提问来源于stack exchange,提问作者ClosDesign
相关产品推荐
相关产品推荐

