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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:06:04