修改Authentik推送邮件的内容与样式

摘要

本文介绍了如何通过修改模版的方案自定义Authentik发送的各种邮件的内容与样式

前言

Authentik作为一个统一身份管理系统,在其日常的运行中,不可避免的需要向用户发送一些邮件(用户有时候需要通过邮箱来找回密码、接收2FA信息)。但是Authentik默认发送的邮件样式有些不美观,在部分邮箱客户端上面显示的邮件还有些不协调(如图1所示),并且我们也有自定义邮件通知内容以及图标样式等的需求。

所以这篇文章,我将会来介绍下如何对Authentik推送的邮件样式进行修改。本文适用于使用Docker Compose部署的Authentik实例,但是采用其他方案部署的实例也可以参考本文章的部分内容。

Authentik发送的密码重置邮件在Outlook(经典版)里头的显示界面
图1 Authentik发送的密码重置邮件在Outlook(经典版)里头的显示界面

大体思路

Authentik的后端是基于Django进行开发的,其使用了Django的模版语言来渲染部分页面[1]。而Authentik发送的邮件,也是基于模版生成的。所以我们需要自己设计一个邮件模版,然后让Authentik基于这个模版生成邮件发送给用户,即可达成自定义推送邮件的样式以及内容。

具体操作

准备自己的模版

首先,我们的邮件模版肯定要能接入变量,否则无法动态显示用户所需要的信息。Authentik邮件常用的变量如表1所示

变量名变量含义
{{ url }}发送给用户的链接(比如说重置密码 / 验证邮箱的链接)
{{ user.username }}触发此邮件操作的用户名
{{ user.email }}触发此邮件操作的用户邮箱
{{ expires }}邮件中的链接有效期
表1 Authentik邮件模版常用变量

根据上述的变量,我们先写一个简单的html模版出来。

{% load i18n %}
{% load humanize %}

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>重置密码</title>
</head>
<body>
  <p>{{ user.username }},您好:</p>

  <p>您正在请求重置您的账号密码。</p>

  <p>请打开下面的链接重置密码:</p>

  <p><a href="{{ url }}">{{ url }}</a></p>

  <p>如果不是您本人操作,请忽略此邮件。</p>

  <p>该链接将在 {{ expires|naturaltime }} 失效。</p>

  <p>此致,敬礼</p>
</body>
</html>

当然,自从Authentik 2024.2版本之后,Authentik支持发送同时包含txt与html内容的Multipart邮件[2]

如果想要发送Multipart邮件的话,只需再配置一个txt文件版本的模版,与html版本的文件名一致,但是文件扩展名为txt。txt版本的模版跟html版本的大部分变量都是相同的。我下面也给一个例子

{% load humanize %}

{{ user.username }},您好:

您正在请求重置您的账号密码。

请打开下面的链接重置密码:

{{ url }}

如果不是您本人操作,请忽略此邮件。

该链接将在 {{ expires|naturaltime }} 失效。

此致,敬礼

将您设计的两个文件分别准备好,并设置好文件名,比如说html版本叫做password_reset.html,然后txt版本叫做password_reset.txt。txt 版本的邮件不是必须的,可以只准备html版本。

将模版挂载到Authentik容器里

默认情况下,使用Authentik官方的compose.yml文件部署的实例默认会挂载compose.yml同级目录中的custom-templates目录到内部的模版目录中。

所以,我们找到当时启动Authentik的目录(即compose.yml所在的目录),找到custom-templates文件夹(如果没有这个目录,请手动创建),如图2所示,然后将刚刚我们准备的两个模版文件(password_reset.txt与password_reset.html)拷贝到这个目录中。

custom-templates文件夹截图
图2 custom-templates文件夹截图

编辑邮件发送阶段

将模版放置到文件夹内后,我们还要前往Authentik的管理员设置中进行一些设置。

首先前往管理员界面,在左侧栏目中,找到流程与阶段选项,点击其中的阶段,在阶段列表中找到一个类型为Email Stage的阶段(比如说我们这里的找回密码邮件发送阶段)[3],点击右侧的编辑按钮。如图3所示

Authentik超级管理员的后台的一个Email Stage阶段
图3 Authentik超级管理员的后台的一个Email Stage阶段

在新弹出来的阶段编辑界面中,可以展开位于底部的“阶段特定设置选项”,其中有一个模版设置项,如图4所示。点开设置项会弹出一个下拉单选列表,可以看到我们刚刚上传的模版,选中您需要的模版即可。

Authentik中的邮件阶段-模版设置项目截图
图4 Authentik中的邮件阶段-模版设置项目截图

选中后点击最底部更新按钮,完成邮件模版设置

测试修改后效果

我们触发一次邮件发送,可以看到邮件样式以及内容均是我们刚刚导入的模版的了,如图5所示。

我们提供的示例邮件模版生成的邮件在MAC自带的邮件应用中显示效果
图5 我们提供的示例邮件模版生成的邮件在MacOS自带的邮件应用中显示效果

查看邮件原文,可以看到邮件中包含txt以及html两个版本的邮件的内容,如图6所示。

根据提供的模版生成的邮件原文
图6 根据提供的模版生成的邮件原文

参考

  1. ^有关更多关于Django的模版语言,您可以参阅Django文档:https://docs.djangoproject.com/zh-hans/6.0/ref/templates/language/
  2. ^这种类型的Multipart邮件中包含了txt以及html两个版本的邮件内容,用户收取邮件的客户端可以选择其中的一种版本进行展示,如需了解更多,请参阅:https://www.rfc-editor.org/info/rfc2046/#section-5.1.4
  3. ^Authentik通过“流程”与“阶段”来决定如登陆、重置密码等操作的行为与逻辑,如果用户需要重置密码,则需要一个重置密码流程,而重置密码流程包含诸如确定用户名、发送邮件等的阶段,如需更深入了解Authentik中的流程,可参阅https://docs.goauthentik.io/add-secure-apps/flows-stages/flow/,如需了解Authentik中的Email Stage阶段,请参阅https://docs.goauthentik.io/add-secure-apps/flows-stages/stages/email/

--------------

本文标题为:

修改Authentik推送邮件的内容与样式

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,记得载明出处。
内容有问题?想与我交流下?点此哦,欢迎前来交流~
上一篇