Keycloak:自定义 ExecuteAction 邮件,是否可以获取用户自定义属性?
Keycloak : custom ExecuteAction Mail, is it possible to get a user custom attribute?
我正在尝试通过覆盖 keycloak 的 executeAction 邮件模板向我的 Keycloak 用户发送自定义邮件。
我创建了:
../myProject/email/text/executeAction.ftl
../myProject/email/messages/messages_fr.properties
../myProject/email/html/executeAction.ftl
我已经收到一封使用此 html/executeAction.ftl 的邮件:
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),user.getAttributes())}
所以我知道我的配置是好的。
上面示例的问题在于,当我只想获取一个时,我显示了一个用户自定义属性列表:
性别=先生或性别=女士
我尝试使用我在那里看到的功能:
https://github.com/keycloak/keycloak/blob/4.5.0.Final/server-spi/src/main/java/org/keycloak/models/UserModel.java
给出以下内容:
<#assign gender= user.getAttributes(gender)/>
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),gender)}
我希望收到一封邮件,里面有用户性别,但没有发送邮件:
我有以下错误:
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
我不明白到底出了什么问题:
我的ftl不好吗?我不是专家,但据我所见,应该没问题。
看起来 keycloak 正在尝试发送邮件,那么为什么当我尝试使用单个属性而不是完整列表时它突然失败了?
另一种选择可能是在 .ftl 中使用某种正则表达式来提取性别,但我不知道这是否可行?
编辑:好的,经过多次试验和错误后我发现了如何做:
我想我对 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)}
我不知道为什么我需要删除 ${} 部分,或者为什么您会通过 attributes.key 而不是使用 getter 来获取 HashMap> 中的值,但它确实有效。 ..
好的,经过多次试验和错误后我发现了如何去做:
我想我对 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)}
我不知道为什么我需要删除 ${} 部分或者为什么你会通过 attributes.key 而不是使用 getter 来获取 HashMap> 中的值,但它工作得很好。 ..
我正在尝试通过覆盖 keycloak 的 executeAction 邮件模板向我的 Keycloak 用户发送自定义邮件。
我创建了:
../myProject/email/text/executeAction.ftl
../myProject/email/messages/messages_fr.properties
../myProject/email/html/executeAction.ftl
我已经收到一封使用此 html/executeAction.ftl 的邮件:
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),user.getAttributes())}
所以我知道我的配置是好的。 上面示例的问题在于,当我只想获取一个时,我显示了一个用户自定义属性列表:
性别=先生或性别=女士
我尝试使用我在那里看到的功能: https://github.com/keycloak/keycloak/blob/4.5.0.Final/server-spi/src/main/java/org/keycloak/models/UserModel.java
给出以下内容:
<#assign gender= user.getAttributes(gender)/>
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),gender)}
我希望收到一封邮件,里面有用户性别,但没有发送邮件:
我有以下错误:
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
我不明白到底出了什么问题: 我的ftl不好吗?我不是专家,但据我所见,应该没问题。 看起来 keycloak 正在尝试发送邮件,那么为什么当我尝试使用单个属性而不是完整列表时它突然失败了?
另一种选择可能是在 .ftl 中使用某种正则表达式来提取性别,但我不知道这是否可行?
编辑:好的,经过多次试验和错误后我发现了如何做:
我想我对 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)}
我不知道为什么我需要删除 ${} 部分,或者为什么您会通过 attributes.key 而不是使用 getter 来获取 HashMap> 中的值,但它确实有效。 ..
好的,经过多次试验和错误后我发现了如何去做:
我想我对 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)}
我不知道为什么我需要删除 ${} 部分或者为什么你会通过 attributes.key 而不是使用 getter 来获取 HashMap> 中的值,但它工作得很好。 ..