有没有办法为我的自定义 Keycloak 电子邮件主题添加样式?

Posted

技术标签:

【中文标题】有没有办法为我的自定义 Keycloak 电子邮件主题添加样式?【英文标题】:Is there a way to add styles to my custom Keycloak Email theme? 【发布时间】:2020-02-12 12:01:36 【问题描述】:

标题说明了一切。

我尝试了多种方法,但似乎没有任何效果。

我尝试在我的 theme.properties 中导入样式表。 styles=css/styles.css

我尝试直接在我的 html 标签中做我的风格。 <h1 style="color:blue;">

我尝试在我的 ftl 文件中使用我的风格,如下所示:

<html>
<style type="text/css">
body 
    margin: 0;
    font-family: 'Source Sans Pro';
    font-weight: 400;
    font-size: 16px;

.header
    background-color: #B70E0C;
    width: 100%;
    height: 96px;


.footer
    flex-shrink: 0;
    width: 100%;
    padding: 20px 0;
    text-align: center;
    font-size: 16px;
    background-color: #2D2D2D;
    z-index: 1;
    position: absolute;
    bottom: 0;


.footer a 
    color: white !important;


a:visited 
    color: initial;


.activate-btn
    border-radius: 8px;
    padding: 12px 28px;
    background-color: #FDC300;
    color: black;
    border-style: hidden;

</style>
<body>
$kcSanitize(msg("emailVerificationBodyHtml", link, linkExpiration, realmName, 
linkExpirationFormatter(linkExpiration)))?no_esc
</body>
</html>

【问题讨论】:

【参考方案1】:

编写 html 电子邮件不像编写 html 网页那样简单,因为几乎所有电子邮件服务都以不同的方式处理传入的电子邮件。有些人可能会忽略

使用zurb,您可以在浏览器中创建和调试电子邮件模板,就像来自 npm 世界的任何其他 UI 应用程序一样。然后,您可以将 Zurb 输出切片为 keycloak freemarker 模板。最后,您将获得主要的 freemarker 模板(带有通用标题、底部链接等),以及用于段落、链接的一堆 freemarker 宏...这些组件将封装所有丑陋的东西,如内联 css、表格等,因此您的业务模板将很简单,看起来很漂亮。这就是我得到的执行所需操作电子邮件

<#import "template.ftl" as layout>
<@layout.emailLayout title=msg('executeActionsSubject')?no_esc; section>

    <#if section = "header">
        <@layout.header text=msg("executeActionsSubject")?no_esc icon="status-icon-green%403x.png"/>

    <#elseif section = "content">

        <#outputformat "plainText">
            <#assign requiredActionsText>
                <#if requiredActions??>
                    <ul>
                    <#list requiredActions>
                        <#items as reqActionItem><li>$msg("requiredAction.$reqActionItem")</li></#items>
                    </#list>
                    </ul>
                </#if>
            </#assign>
        </#outputformat>

        <@layout.paragraph>
            $msg("executeActionsBodyIntro", realmName)?no_esc
        </@layout.paragraph>

        <b>
            $msg("executeActionsList", requiredActionsText)?no_esc
        </b>

        <@layout.paragraph>
            $msg("executeActionsClickLinkNote")?no_esc
        </@layout.paragraph>

        <@layout.mainAction text=msg("executeActionsButtonText")?no_esc href=link/>

        <@layout.secondaryText>
            $kcSanitize(msg("expirationNote", linkExpirationFormatter(linkExpiration)))?no_esc
        </@layout.secondaryText>

        <@layout.secondaryText>
            $msg("mistakeDeleteText")?no_esc
        </@layout.secondaryText>

    </#if>

</@layout.emailLayout>

UPD。还有其他用于撰写电子邮件的框架。例如 MJML。无论如何,任何这些框架的开发流程都是完全相同的,所以请随意使用其中任何一个。

【讨论】:

这看起来确实像要走的路,我只是不太确定“可以将 Zurb 输出切片到 keycloak freemarker 模板”部分。有没有办法自动做到这一点? 不幸的是没有,但它并不像看起来那么难。刚开始创建布局并用Zurb测试它作为网页(注意Zurb也允许有通用的骨架模板,所以其他电子邮件布局可以继承它并只修改“业务内容”)。至于我,我只需要一个完整的工作日来为我公司的所有 keycloak 电子邮件创建 Zurb 布局。还有一天将它们移植到 freemarker 和调试。如果考虑到我不是前端人员,这还不错。 @solveMe 您是否使用给定的解决方案实现了正确的电子邮件模板,我还需要创建重置密码电子邮件模板? 能否请您出示一下您的 template.ftl 文件,它是由 Zurb 创建的骨架吗? @YachithaSandaruwan 我通过 zurb 创建了几个布局(zurb 还允许您为标题、徽标、底部链接创建基本模板)。然后我用浏览器对其进行了测试(查看 zurb 文档以运行测试/预览模式)。当我对结果感到满意时,我运行 Zurb build 并获得电子邮件的最终输出。下一步是从这个杂乱的输出中提取一些部分,并从中组成一个 template.ftl 和其他宏(例如段落)。关键提示:要在最终输出中检测结构元素的边界,您应该在使用 Zurb 标记时彻底注释它们。【参考方案2】:

您可以使用此代码

body 
  margin: 0;
  font-family: 'Source Sans Pro';
  font-weight: 400;
  font-size: 16px;


.header 
  background-color: #B70E0C;
  width: 100%;
  height: 96px;


.footer 
  flex-shrink: 0;
  width: 100%;
  padding: 20px 0;
  text-align: center;
  font-size: 16px;
  background-color: #2D2D2D;
  z-index: 1;
  position: absolute;
  bottom: 0;


.footer a 
  color: white !important;


a:visited 
  color: initial;


.activate-btn 
  border-radius: 8px;
  padding: 12px 28px;
  background-color: #FDC300;
  color: black;
  border-style: hidden;
<h1 style="color:blue;">lorem ipsum dolor</h1>
$kcSanitize(msg("emailVerificationBodyHtml", link, linkExpiration, realmName, linkExpirationFormatter(linkExpiration)))?no_esc
<p style="color:red;">lorem ipsum dolor sit amet</p>

【讨论】:

这仅适用于 kcSanitize 之外的内容。

以上是关于有没有办法为我的自定义 Keycloak 电子邮件主题添加样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 keycloak 中的自定义客户端获取角色?

KeyCloak 中的自定义提供程序,可以根据用户名和密码进行身份验证

使用 Keycloak 中的自定义 Admin REST API 获取用户的 ID 令牌

从 django 中的自定义数据库表中检查电子邮件和密码

Keycloak:一个领域的多个电子邮件地址?

Chrome 中的自定义域