Apache DolphinScheduler Email 邮件告警插件:告警实例配置与源码实现详解
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
在 Apache DolphinScheduler(数据编排平台)中,当工作流失败、任务告警或流程完成时,通过邮件通知相关负责人是最常见、最通用的告警手段。本文以官方文档 docs/docs/en/guide/alert/email.md 为骨架,完整讲解 Email 告警插件的配置全流程(从进入告警实例管理到填写 SMTP 参数),并深入dolphinscheduler-alert-email插件模块源码,说明每个配置项在底层如何被解析与使用、四种展示类型(table / text / attachment / table attachment)的生成逻辑,以及发送成功与失败时的返回语义。读完本文,你将能够独立完成一次邮件告警的配置与排障。
一、前提:在告警实例管理中创建告警实例
Email 告警插件属于 DolphinScheduler 告警体系中的一个独立插件(Alert Channel)。官方文档明确指出:如果需要使用 Email 进行告警,请在"告警实例管理"中创建告警实例,并选择 Email 插件。
操作入口位于"安全"(Security)模块下的告警实例管理(Alarm Instance Manage)页面,具体路径为:Security → Alarm Instance Manage → Create Alarm Instance。页面整体流程如下:
- 进入告警实例管理页面,点击右上角"创建告警实例(Create Alarm Instance)"按钮(对应 docs/docs/en/guide/alert/email.md 中的第一张截图 email-alter-setup1-en.png);
- 在弹出的对话框中,从"选择插件(Select plugin)"下拉列表中选中Email插件(对应截图 email-alter-setup2-en.png);
- 填写邮件服务器与收件人相关参数后确认保存,即完成告警实例创建(对应截图 email-alter-setup3-en.png)。
告警实例创建完成后,即可在工作流定义、任务失败重试等场景中引用该告警实例;当流程/任务状态满足告警条件时,DolphinScheduler 会调用对应的 Alert Channel 发送邮件。
二、Email 插件配置项全解析(UI 表单字段 → 源码参数映射)
Email 插件在 UI 上呈现的所有配置项,均由插件工厂类EmailAlertChannelFactory在运行时动态声明,源码位于 EmailAlertChannelFactory.java。该类实现了AlertChannelFactory接口,通过@AutoService注解完成插件自动注册,其name()方法返回插件名"Email"。
下表将 UI 表单字段、源码常量名(见 MailParamsConstants.java)及 JavaMail 底层属性一一对应:
| UI 字段 | 源码参数名(NAME_*) | JavaMail 属性 | 是否必填 | 默认值 / 说明 |
|---|---|---|---|---|
| Receivers(收件人) | receivers | - | 必填 | 多个邮箱以英文逗号,分隔;在 MailSender.java 中被split(",")解析为收件人列表,若为空直接抛出AlertEmailException |
| ReceiverCcs(抄送) | receiverCcs | - | 选填 | 多个邮箱以英文逗号,分隔;留空则抄送列表为空 |
| SMTP Host | serverHost | mail.smtp.host | 必填 | SMTP 服务器地址,如smtp.example.com |
| SMTP Port | serverPort | mail.smtp.port | 必填 | 默认值25;常见替代端口如 465(SSL)、587(STARTTLS) |
| Sender(发件人) | sender | - | 必填 | 发件人邮箱地址 |
| SMTP Auth(认证开关) | enableSmtpAuth | mail.smtp.auth | 必填 | 单选 YES/NO,默认YES(即"true");仅当开启时才强制校验用户名与密码非空 |
| User(用户名) | User | - | 按需 | 认证用户名,多数场景为发件邮箱账号;仅当 SMTP Auth 为 YES 时必填 |
| Password(密码/授权码) | Password | - | 按需 | 表单类型为password;仅当 SMTP Auth 为 YES 时必填,建议使用邮箱服务商提供的授权码 |
| SMTP STARTTLS Enable | starttlsEnable | mail.smtp.starttls.enable | 必填 | 单选 YES/NO,默认NO("false") |
| SMTP SSL Enable | sslEnable | mail.smtp.ssl.enable | 必填 | 单选 YES/NO,默认NO("false");SSL 与 STARTTLS 可独立开启 |
| SMTP SSL Trust | smtpSslTrust | mail.smtp.ssl.trust | 必填 | 默认值"*",表示信任所有主机证书 |
| Show Type(展示类型) | showType | - | 必填 | 单选,默认table,可选 table / text / attachment / table attachment,详见下文第四节 |
2.1 参数校验规则(Validate)
从 EmailAlertChannelFactory.java 可以看出,每个参数都通过 SPI 参数构建器定义:
receivers、serverHost、serverPort、sender通过Validate.newBuilder().setRequired(true)标记为必填;serverPort额外校验DataType.NUMBER,即只能填写数字端口;enableSmtpAuth、starttlsEnable、sslEnable、smtpSslTrust、showType同样为必填项,但 UI 上已给出默认值,因此通常无需修改;- 密码输入框使用
setType("password"),确保敏感信息在 UI 上掩码显示。
一个值得注意的细节是:用户名(User)与密码(Password)在 UI 上不强制必填,但 MailSender.java 在构造函数中做了二次校验——当enableSmtpAuth为"true"时,会通过requireNonNull强制要求mailUser与mailPasswd非空,否则在创建MailSender时即抛出异常。也就是说:只要开启了 SMTP 认证,用户名和密码就是硬性前提。
三、从告警触发到邮件发出的调用链
当告警条件被触发后,Email 插件的执行入口是 EmailAlertChannel.java:
- 告警服务将告警标题(title)、内容(content)以及该告警实例的参数字典(
AlertParams)封装为AlertInfo; EmailAlertChannel.process(info)取出paramsMap,若为null则直接返回失败结果("mail params is null");- 否则构造
MailSender(paramsMap),调用mailSender.sendMails(title, content)发送邮件; - 发送成功后设置结果消息为
"email send success.",失败则统一记为"alert send error.",便于在告警中心查看失败原因。
核心发送逻辑全部集中在 MailSender.java:
- Session 构建(
getSession(),MailSender.java):将mail.smtp.host、mail.smtp.port、mail.smtp.auth、mail.smtp.starttls.enable、mail.smtp.ssl.enable、mail.smtp.ssl.trust逐一写入Properties,传输协议固定为SMTP(常量mail.transport.protocol = "SMTP",见 EmailConstants.java);同时通过Authenticator携带用户名/密码,并注册SMTPProvider。 - 收件人/抄送处理:收件人与抄送均按逗号拆分,
removeIf(StringUtils::isEmpty)过滤空串;若收件人与抄送均为空则直接返回失败,不再执行发送(MailSender.java)。 - 附件路径:
xls.file.path参数(即xlsFilePath)若未配置,默认使用/tmp/xls作为 Excel 附件临时目录(MailSender.java)。
四、Show Type:邮件内容的四种展示形态
showType决定告警内容在邮件中的呈现方式。其枚举定义位于 ShowType.java:TABLE(0)、TEXT(1)、ATTACHMENT(2)、TABLE_ATTACHMENT(3)。UI 下拉框仅暴露 table / text / attachment / table attachment 四个选项。
4.1 TABLE(默认,表格展示)
将告警内容按 JSON 数组解析(每个元素为一个对象,key 为列名、value 为单元格值),由DefaultHTMLTemplate(DefaultHTMLTemplate.java)生成带<thead>表头的 HTML 表格:
- 第一条记录的表头作为
<th>表头行; - 每条记录渲染为一行
<tr>/<td>; - 邮件正文使用
text/html;charset=utf-8(EmailConstants.java 中的TEXT_HTML_CHARSET_UTF_8)。
4.2 TEXT(纯文本)
将告警内容统一转换为 JSON 数组后,每条记录作为一行<td>输出;若内容是单个 JSON 对象而非数组,会先包装为单元素数组再渲染,避免解析报错(DefaultHTMLTemplate.java)。
4.3 ATTACHMENT(附件展示)
邮件正文仅提示"请查看附件"(内容为Please see the attachment <title>.xlsx),真正的告警明细以Excel(.xlsx)附件形式发送。附件生成由 ExcelUtils.java 完成:
- 使用 POI
SXSSFWorkbook流式生成,窗口行数为 10000(XLSX_WINDOW_ROW),支持海量行数据; - 表头取 JSON 数组首条记录的 key 集合,表头与每行高度固定为 500;
- 数值类型单元格直接写入数字,文本超过 Excel 2007 最大文本长度(32767 字符)时截断并追加
...(truncated); - 按列名长度动态设置列宽;
- 附件文件名包含随机 UUID,避免多任务并发产生同名冲突(MailSender.java);发送完成后会删除临时文件。
4.4 TABLE_ATTACHMENT(表格 + 附件)
邮件正文渲染 HTML 表格(仅显示前 1000 条记录,NUMBER_1000常量见 EmailConstants.java,完整数据仍写入 Excel 附件),同时附带 .xlsx 附件,兼顾正文可读性与数据完整性。
// 四种 showType 的分支逻辑(MailSender.sendMails 简化示意) if (showType.equals("table") || showType.equals("text")) { // 使用 HtmlEmail 直接发送 HTML 正文 } else if (showType.equals("attachment") || showType.equals("table attachment")) { // 生成 Excel 附件并通过 MimeMessage/Transport 发送 }五、实战:配置一次邮件告警(以常见 SMTP 服务商为例)
以下以使用 SMTP 服务的通用步骤说明(不同邮箱服务商的服务器地址与端口可能不同,请以其官方说明为准):
- 在邮箱服务商处开启 SMTP 服务并获取授权码(部分服务商要求使用独立授权码而非登录密码);
- 进入 DolphinScheduler UI:
Security → Alarm Instance Manage → Create Alarm Instance,插件选择Email; - 按第二节的字段表填写:Receivers 填告警接收人(逗号分隔多邮箱),SMTP Host/Port 填服务器地址与端口,Sender 填发件邮箱,开启 SMTP Auth 并填写用户名与授权码;
- 若使用 465 端口,建议开启SMTP SSL Enable = YES;若使用 587 端口,建议开启SMTP STARTTLS Enable = YES;SSL 与 STARTTLS 二选一通常即可满足加密需求;
- Show Type 按需选择(常规流程告警推荐
table,大量明细数据推荐table attachment); - 点击 Confirm 保存后,可将该告警实例关联到工作流或任务的告警策略中,触发后即可收到邮件。
六、常见问题与排障指引
- 发送失败且提示
mail params is null:告警实例参数未正确加载,请检查告警实例是否保存成功、插件是否被正确注册(Email 插件位于 dolphinscheduler-alert-email 模块)。 - 报错
receivers must not be null等参数异常:MailSender构造函数对所有必填参数做了requireNonNull校验,消息格式为<参数名> must not be null,根据报错参数名对照第二节字段表补齐即可。 - 开启了 SMTP Auth 但未填用户/密码:即使 UI 上不强制必填,源码也会在
MailSender构造时抛出异常(MailSender.java),务必补齐。 - 认证失败(Authentication failed):检查用户名是否为完整邮箱、密码是否为授权码、
mail.smtp.auth是否开启。 - SSL 证书异常:默认
smtpSslTrust=*信任所有证书,若安全策略不允许通配信任,可配置为具体的 CA 主机名。 - 附件目录无权限:确认运行 Alert Server 的系统用户对
xlsFilePath(默认/tmp/xls)有读写权限,否则生成 Excel 附件会抛出Create xlsx directory error。 - 邮件乱码:插件已固定使用 UTF-8 字符集(
text/html;charset=utf-8),请确认告警内容本身为 UTF-8 编码。
七、相关源码与测试
如需深入验证插件行为,可继续阅读以下仓库文件:
- 插件注册与参数声明:EmailAlertChannelFactory.java
- 参数名与 JavaMail 属性映射:MailParamsConstants.java
- 发送主流程与 Session 构建:MailSender.java
- 邮件模板渲染:DefaultHTMLTemplate.java
- Excel 附件生成:ExcelUtils.java
- 展示类型枚举:ShowType.java
- 插件单元测试:
dolphinscheduler-alert-email/src/test/java/org/apache/dolphinscheduler/plugin/alert/email/(含 EmailAlertChannelFactoryTest.java、EmailAlertChannelTest.java、DefaultHTMLTemplateTest.java、ExcelUtilsTest.java、MailUtilsTest.java),覆盖了参数工厂、邮件发送、HTML 模板与 Excel 生成等核心行为。
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考