Apache DolphinScheduler Email 邮件告警插件:告警实例配置与源码实现详解
2026/9/14 19:21:14 网站建设 项目流程

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。页面整体流程如下:

  1. 进入告警实例管理页面,点击右上角"创建告警实例(Create Alarm Instance)"按钮(对应 docs/docs/en/guide/alert/email.md 中的第一张截图 email-alter-setup1-en.png);
  2. 在弹出的对话框中,从"选择插件(Select plugin)"下拉列表中选中Email插件(对应截图 email-alter-setup2-en.png);
  3. 填写邮件服务器与收件人相关参数后确认保存,即完成告警实例创建(对应截图 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 HostserverHostmail.smtp.host必填SMTP 服务器地址,如smtp.example.com
SMTP PortserverPortmail.smtp.port必填默认值25;常见替代端口如 465(SSL)、587(STARTTLS)
Sender(发件人)sender-必填发件人邮箱地址
SMTP Auth(认证开关)enableSmtpAuthmail.smtp.auth必填单选 YES/NO,默认YES(即"true");仅当开启时才强制校验用户名与密码非空
User(用户名)User-按需认证用户名,多数场景为发件邮箱账号;仅当 SMTP Auth 为 YES 时必填
Password(密码/授权码)Password-按需表单类型为password;仅当 SMTP Auth 为 YES 时必填,建议使用邮箱服务商提供的授权码
SMTP STARTTLS EnablestarttlsEnablemail.smtp.starttls.enable必填单选 YES/NO,默认NO"false"
SMTP SSL EnablesslEnablemail.smtp.ssl.enable必填单选 YES/NO,默认NO"false");SSL 与 STARTTLS 可独立开启
SMTP SSL TrustsmtpSslTrustmail.smtp.ssl.trust必填默认值"*",表示信任所有主机证书
Show Type(展示类型)showType-必填单选,默认table,可选 table / text / attachment / table attachment,详见下文第四节

2.1 参数校验规则(Validate)

从 EmailAlertChannelFactory.java 可以看出,每个参数都通过 SPI 参数构建器定义:

  • receiversserverHostserverPortsender通过Validate.newBuilder().setRequired(true)标记为必填
  • serverPort额外校验DataType.NUMBER,即只能填写数字端口;
  • enableSmtpAuthstarttlsEnablesslEnablesmtpSslTrustshowType同样为必填项,但 UI 上已给出默认值,因此通常无需修改;
  • 密码输入框使用setType("password"),确保敏感信息在 UI 上掩码显示。

一个值得注意的细节是:用户名(User)与密码(Password)在 UI 上不强制必填,但 MailSender.java 在构造函数中做了二次校验——当enableSmtpAuth"true"时,会通过requireNonNull强制要求mailUsermailPasswd非空,否则在创建MailSender时即抛出异常。也就是说:只要开启了 SMTP 认证,用户名和密码就是硬性前提

三、从告警触发到邮件发出的调用链

当告警条件被触发后,Email 插件的执行入口是 EmailAlertChannel.java:

  1. 告警服务将告警标题(title)、内容(content)以及该告警实例的参数字典(AlertParams)封装为AlertInfo
  2. EmailAlertChannel.process(info)取出paramsMap,若为null则直接返回失败结果("mail params is null")
  3. 否则构造MailSender(paramsMap),调用mailSender.sendMails(title, content)发送邮件;
  4. 发送成功后设置结果消息为"email send success.",失败则统一记为"alert send error.",便于在告警中心查看失败原因。

核心发送逻辑全部集中在 MailSender.java:

  • Session 构建getSession(),MailSender.java):将mail.smtp.hostmail.smtp.portmail.smtp.authmail.smtp.starttls.enablemail.smtp.ssl.enablemail.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 完成:

  • 使用 POISXSSFWorkbook流式生成,窗口行数为 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 服务的通用步骤说明(不同邮箱服务商的服务器地址与端口可能不同,请以其官方说明为准):

  1. 在邮箱服务商处开启 SMTP 服务并获取授权码(部分服务商要求使用独立授权码而非登录密码);
  2. 进入 DolphinScheduler UI:Security → Alarm Instance Manage → Create Alarm Instance,插件选择Email
  3. 按第二节的字段表填写:Receivers 填告警接收人(逗号分隔多邮箱),SMTP Host/Port 填服务器地址与端口,Sender 填发件邮箱,开启 SMTP Auth 并填写用户名与授权码;
  4. 若使用 465 端口,建议开启SMTP SSL Enable = YES;若使用 587 端口,建议开启SMTP STARTTLS Enable = YES;SSL 与 STARTTLS 二选一通常即可满足加密需求;
  5. Show Type 按需选择(常规流程告警推荐table,大量明细数据推荐table attachment);
  6. 点击 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询