告别手动通知:Flowable-Engine邮件任务零代码配置指南
你是否还在为流程节点的通知跟进烦恼?审批通过后需要手动发送邮件?任务超时提醒依赖人工检查?本文将带你用Flowable-Engine的邮件任务功能,30分钟搭建全自动通知系统,彻底解放运营人员的双手。读完本文你将掌握:SMTP服务器配置、动态邮件内容生成、任务失败处理全流程。
核心功能与应用场景
Flowable-Engine的邮件任务(Mail Task)是BPMN 2.0标准中的服务任务(Service Task)一种特殊实现,通过DefaultActivityBehaviorFactory类创建邮件行为处理器,支持在流程执行过程中自动发送电子邮件通知。典型应用场景包括:
- 审批流程中的状态通知(如"请假申请已批准")
- 任务到期提醒(如"您有3个待处理报销单将在24小时后逾期")
- 系统异常告警(如"流程实例启动失败,错误代码:XXX")
- 业务数据报告(如"每日销售数据已生成,点击查看详情")
邮件服务基础配置
SMTP服务器参数设置
邮件任务依赖JavaMail API实现邮件发送,需在Flowable引擎配置中指定SMTP服务器参数。在Spring环境下,可通过application.properties配置:
# SMTP服务器地址(以QQ邮箱为例)
flowable.mail.server.host=smtp.qq.com
# SMTP服务器端口(SSL加密通常为465)
flowable.mail.server.port=465
# 发件人邮箱账号
flowable.mail.server.username=notifications@company.com
# 发件人邮箱密码(第三方客户端授权码)
flowable.mail.server.password=your_authorization_code
# 是否启用TLS加密
flowable.mail.server.use-tls=true
# 邮件发送超时时间(毫秒)
flowable.mail.server.timeout=5000
配置文件存放路径
标准配置文件通常放置在以下位置,根据部署方式选择:
- 开发环境:src/main/resources/application.properties
- 生产环境:distro/src/main/resources/flowable-default.properties
- Docker部署:通过环境变量注入,对应配置文件docker/config/rest-postgres.yml
BPMN流程设计与实现
邮件任务基本结构
在BPMN 2.0流程图中,邮件任务表现为带信封图标的服务任务,需设置以下核心属性:
<serviceTask id="sendApprovalEmail" name="发送审批通知">
<extensionElements>
<!-- 邮件接收人(支持逗号分隔多个地址) -->
<flowable:field name="to" stringValue="approver@company.com" />
<!-- 邮件主题 -->
<flowable:field name="subject" stringValue="【流程通知】您有新的报销单需要审批" />
<!-- 邮件正文(纯文本格式) -->
<flowable:field name="text">
<flowable:string>
尊敬的${approverName}:
您有一份来自${applicantName}的报销单(单号:${billNo})需要审批,
金额:${amount}元,请登录系统处理。
</flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>
动态内容生成
通过流程变量实现个性化邮件内容,支持EL表达式取值。例如从业务表单获取申请人信息:
<!-- 动态接收人 -->
<flowable:field name="to" expression="${formData.approverEmail}" />
<!-- 带流程变量的主题 -->
<flowable:field name="subject" expression="【${processName}】${status}通知(单号:${businessKey})" />
<!-- HTML格式正文 -->
<flowable:field name="html">
<flowable:expression>
<![CDATA[
<html>
<body>
<h3>您好,${assignee}:</h3>
<p>流程【${processDefinitionName}】已到达您的处理节点,相关信息:</p>
<table border="1">
<tr><td>申请单号</td><td>${businessKey}</td></tr>
<tr><td>申请时间</td><td>${createTime}</td></tr>
<tr><td>处理截止时间</td><td>${dueDate}</td></tr>
</table>
<p><a href="${taskUrl}">点击处理任务</a></p>
</body>
</html>
]]>
</flowable:expression>
</flowable:field>
高级功能与最佳实践
附件添加实现
通过attachments字段添加邮件附件,支持从流程变量或外部存储获取文件:
<!-- 添加单个附件 -->
<flowable:field name="attachments">
<flowable:expression>
${attachmentService.getReportFile(processInstanceId)}
</flowable:expression>
</flowable:field>
<!-- 添加多个附件 -->
<flowable:field name="attachments">
<flowable:expression>
[${contractFile}, ${invoiceFile}]
</flowable:expression>
</flowable:field>
附件对象需实现org.flowable.engine.delegate.mail.MailAttachment接口,提供文件名、MIME类型和输入流。
异常处理与重试机制
邮件发送失败时,Flowable引擎会抛出MailException,可通过以下方式处理:
- 边界事件捕获:
<serviceTask id="sendEmail" name="发送邮件">
<!-- 邮件任务配置 -->
</serviceTask>
<boundaryEvent id="mailErrorEvent" attachedToRef="sendEmail" cancelActivity="false">
<errorEventDefinition errorRef="mailFailed" />
</boundaryEvent>
<serviceTask id="handleMailError" name="处理发送失败">
<extensionElements>
<flowable:class name="com.company.handler.MailFailureHandler" />
</extensionElements>
</serviceTask>
- 重试策略配置: 在DefaultActivityBehaviorFactory中设置重试次数和间隔:
public ActivityBehavior createMailActivityBehavior(ServiceTask serviceTask) {
MailActivityBehavior behavior = new MailActivityBehavior();
behavior.setMaxRetries(3); // 最大重试次数
behavior.setRetryDelay(60000); // 重试间隔(毫秒)
return behavior;
}
监控与日志分析
邮件发送状态跟踪
所有邮件任务的执行记录会保存到Flowable的ACT_HI_DETAIL表,可通过历史服务查询:
List<HistoricDetail> details = historyService.createHistoricDetailQuery()
.processInstanceId(processInstanceId)
.activityId("sendApprovalEmail")
.variableUpdates()
.list();
日志配置
在qa/logging/log4j.properties中配置邮件模块日志级别:
# 邮件发送详细日志(开发环境)
log4j.logger.org.flowable.engine.impl.bpmn.behavior.MailActivityBehavior=DEBUG
# 仅记录错误日志(生产环境)
log4j.logger.org.flowable.engine.impl.bpmn.behavior.MailActivityBehavior=ERROR
性能优化建议
- 异步发送模式: 将邮件任务标记为异步执行,避免阻塞流程实例:
<serviceTask id="sendEmail" name="发送邮件" flowable:async="true">
<!-- 邮件配置 -->
</serviceTask>
- 连接池配置: 在高并发场景下,配置SMTP连接池:
# 最大连接数
flowable.mail.server.pool.max-total=20
# 每个服务器的最大连接数
flowable.mail.server.pool.max-per-route=5
# 连接超时时间(毫秒)
flowable.mail.server.pool.connection-timeout=3000
- 模板引擎集成: 使用Freemarker或Thymeleaf生成邮件内容,避免在BPMN XML中硬编码:
@Service
public class MailTemplateService {
public String renderTemplate(String templateName, Map<String, Object> variables) {
// 模板渲染逻辑
}
}
常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 认证失败 | 密码错误或未开启SMTP服务 | 1. 检查第三方客户端授权码 2. 在邮箱设置中启用SMTP服务 |
| 连接超时 | 服务器地址/端口错误或网络限制 | 1. 验证SMTP服务器地址和端口 2. 检查防火墙是否允许出站连接 |
| 中文乱码 | 字符编码未设置 | 在邮件头指定编码:Content-Type: text/html; charset=UTF-8 |
| 附件过大 | SMTP服务器限制附件大小 | 1. 分卷发送大文件 2. 发送下载链接替代附件 |
官方资源与学习路径
- 核心文档:docs/docusaurus/docs/bpmn/index.md
- API参考:docs/public-api/references/swagger/index.html
- 示例项目:modules/flowable-spring-boot/flowable-spring-boot-samples
- 视频教程:Flowable官方YouTube频道"Mail Task Configuration"系列
通过本文介绍的配置方法和最佳实践,你可以快速实现流程自动化通知,将运营人员从重复性工作中解放出来。邮件任务作为Flowable-Engine众多服务任务的一种,展示了BPMN 2.0标准在业务流程自动化中的强大能力。建议结合实际业务场景,进一步探索动态表达式、事件驱动等高级特性,构建更加智能的流程通知系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



