Keycloak:自定义ExecuteAction Mail,是否可以获取用户自定义属性?

时间:2019-06-19 09:09:46

标签: html-email freemarker keycloak keycloak-services

我正在尝试通过覆盖keycloak的executeAction邮件模板来向Keycloak用户发送自定义邮件。

我已经创建了:

cy.task('launchPuppeteer', {param1: 'whatever1', param2: 'whatever2'})
            .then(valuesForCypress => cy.wrap(valuesForCypress).should('eq', expectedValues))

我已经收到一封与此html / executeAction.ftl一起工作的邮件:

../myProject/email/text/executeAction.ftl
../myProject/email/messages/messages_fr.properties
../myProject/email/html/executeAction.ftl

所以我知道我的配置很好。 上面的示例的问题在于,当我只想获取一个用户自定义属性时,会显示一个列表:

gender = Mr或gender = Mrs

我尝试使用在那里看到的功能: https://github.com/keycloak/keycloak/blob/4.5.0.Final/server-spi/src/main/java/org/keycloak/models/UserModel.java

给出以下内容:

${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),user.getAttributes())}

我希望收到一封包含用户性别的邮件,但没有发送邮件:

我遇到以下错误:

<#assign gender= user.getAttributes(gender)/>

${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),gender)}

我不明白到底出了什么问题: 我的ftl不好吗?我不是专家,但是从我看来,应该没问题。 看来keycloak正在尝试发送邮件,所以为什么当我尝试使用单个属性而不是完整列表时突然失败了?

另一种选择可能是在.ftl中使用某种正则表达式来提取性别,但我不知道是否可能?

编辑:好的,经过反复试验,我发现该怎么做:

我猜我缺乏关于FTL的知识是问题。我这样做可以使它起作用:

ERROR [org.keycloak.services] (default task-1) KC-SERVICES0029: Failed to send email: javax.mail.MessagingException: IOException while sending message;
      nested exception is:
        java.io.IOException: Exception writing Multipart
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1308)
        at org.keycloak.email.DefaultEmailSenderProvider.send(DefaultEmailSenderProvider.java:142)
        at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:251)

.......
Caused by: java.io.IOException: Exception writing Multipart
        at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:83)
        at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:897)
        at javax.activation.DataHandler.writeTo(DataHandler.java:330)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1652)
        at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1259)
        ... 84 more
Caused by: javax.mail.MessagingException: Empty multipart: multipart/alternative; 
    boundary="----=_Part_0_165447285.1560929205027"
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:548)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    ... 89 more

我不知道为什么我需要删除$ {}部分,或者为什么要通过执行attribute.key而不是使用getter来获得HashMap中的值,但是它确实可以工作...

1 个答案:

答案 0 :(得分:0)

好吧,经过反复试验,我发现该怎么做:

我猜我缺乏关于FTL的知识是问题。我这样做可以使它起作用:

<#assign attributes = user.getAttributes()>
<#assign civilite = attributes.civilite?capitalize>
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),civilite)}

我不知道为什么我需要删除$ {}部分,或者为什么要通过执行attribute.key而不是使用getter来获得HashMap中的值,但是它确实可以工作...

相关问题