Skip to content

Commit 7a4f953

Browse files
committed
feat: sendemail节点新增是否发送飞书选项#AI Commit#
1 parent 05eddc7 commit 7a4f953

8 files changed

Lines changed: 3700 additions & 0 deletions

File tree

docs/1.23.0/design/sendemail飞书发送_设计.md

Lines changed: 482 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
# language: zh-CN
2+
功能: sendemail节点飞书发送功能
3+
作为DSS工作流开发者
4+
我希望在sendemail节点中配置飞书发送
5+
以便工作流执行结果能同时通过飞书通知到指定用户
6+
7+
背景:
8+
假如 用户已登录DSS系统
9+
而且 DSS服务器已配置飞书应用参数(appId/appSecret)
10+
而且 DSS服务器与飞书API网络连通
11+
12+
# 配置前提
13+
# | 配置项 | 值 | 说明 |
14+
# |-------|-----|------|
15+
# | wds.dss.appconn.feishu.enabled | true/false | 飞书发送全局开关 |
16+
# | wds.dss.appconn.feishu.app.id | 有效AppID | 飞书应用App ID |
17+
# | wds.dss.appconn.feishu.app.secret | 有效AppSecret | 飞书应用App Secret |
18+
19+
# ============================================================
20+
# 场景1: 飞书功能全局开关控制
21+
# ============================================================
22+
23+
场景: 飞书启用且配置完整时,sendemail节点同时发送邮件和飞书消息
24+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
25+
而且 飞书应用appId和appSecret配置正确
26+
而且 sendemail节点参数feishuTo配置了有效的open_id
27+
而且 sendemail节点包含邮件主题和CSV附件
28+
执行sendemail节点
29+
那么 邮件发送成功
30+
而且 飞书接收者收到文本消息"[DSS邮件通知] {邮件主题}"
31+
而且 飞书接收者收到CSV文件消息
32+
而且 sendemail节点状态为成功
33+
34+
场景: 飞书未启用时,sendemail节点仅发送邮件
35+
假如 DSS配置wds.dss.appconn.feishu.enabled=false
36+
而且 sendemail节点参数feishuTo配置了有效的open_id
37+
而且 sendemail节点包含邮件主题和附件
38+
执行sendemail节点
39+
那么 邮件发送成功
40+
而且 不调用任何飞书API
41+
而且 sendemail节点状态为成功
42+
43+
# ============================================================
44+
# 场景2: feishuTo参数控制
45+
# ============================================================
46+
47+
场景: feishuTo为空时,仅发送邮件不发送飞书消息
48+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
49+
而且 sendemail节点参数feishuTo为空或未配置
50+
而且 sendemail节点包含邮件主题和附件
51+
执行sendemail节点
52+
那么 邮件发送成功
53+
而且 不执行飞书发送
54+
而且 sendemail节点状态为成功
55+
56+
场景: feishuTo为纯空格时,仅发送邮件不发送飞书消息
57+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
58+
而且 sendemail节点参数feishuTo为" "(仅空格)
59+
执行sendemail节点
60+
那么 邮件发送成功
61+
而且 不执行飞书发送
62+
而且 sendemail节点状态为成功
63+
64+
场景: feishuTo配置多个接收者时,所有接收者均收到飞书消息
65+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
66+
而且 sendemail节点参数feishuTo为"ou_user1,ou_user2,ou_user3"
67+
而且 sendemail节点包含邮件主题和1个CSV附件
68+
执行sendemail节点
69+
那么 邮件发送成功
70+
而且 ou_user1收到文本消息和文件消息
71+
而且 ou_user2收到文本消息和文件消息
72+
而且 ou_user3收到文本消息和文件消息
73+
而且 sendemail节点状态为成功
74+
75+
场景: feishuTo含前后空格时,空格被自动去除
76+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
77+
而且 sendemail节点参数feishuTo为" ou_user1 , ou_user2 "
78+
执行sendemail节点
79+
那么 ou_user1和ou_user2均收到飞书消息
80+
而且 不向含空格的ID发送消息
81+
82+
# ============================================================
83+
# 场景3: 飞书消息内容
84+
# ============================================================
85+
86+
场景: 飞书发送邮件主题作为文本消息
87+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
88+
而且 sendemail节点邮件主题为"2024年Q4销售报表"
89+
而且 sendemail节点参数feishuTo配置了有效的open_id
90+
执行sendemail节点
91+
那么 飞书接收者收到文本消息"[DSS邮件通知] 2024年Q4销售报表"
92+
93+
场景: 邮件主题为null时,飞书使用默认主题发送文本消息
94+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
95+
而且 sendemail节点邮件主题为null
96+
而且 sendemail节点参数feishuTo配置了有效的open_id
97+
执行sendemail节点
98+
那么 飞书接收者收到文本消息"[DSS邮件通知] DSS Email Notification"
99+
100+
场景: 邮件主题含特殊字符时,飞书文本消息正确转义
101+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
102+
而且 sendemail节点邮件主题包含双引号和换行符
103+
而且 sendemail节点参数feishuTo配置了有效的open_id
104+
执行sendemail节点
105+
那么 飞书文本消息中双引号被转义为\"
106+
而且 飞书文本消息中换行符被转义为\n
107+
而且 飞书消息JSON格式合法
108+
109+
# ============================================================
110+
# 场景4: 附件格式支持
111+
# ============================================================
112+
113+
场景: 飞书发送CSV格式附件
114+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
115+
而且 sendemail节点参数feishuTo配置了有效的open_id
116+
而且 sendemail节点包含CSV附件
117+
当 执行sendemail节点
118+
那么 CSV文件成功上传到飞书
119+
而且 飞书接收者收到CSV文件消息
120+
121+
场景: 飞书发送Excel格式附件
122+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
123+
而且 sendemail节点参数feishuTo配置了有效的open_id
124+
而且 sendemail节点包含Excel附件
125+
当 执行sendemail节点
126+
那么 Excel文件成功上传到飞书
127+
而且 飞书接收者收到Excel文件消息
128+
129+
场景: 飞书发送PNG图片附件
130+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
131+
而且 sendemail节点参数feishuTo配置了有效的open_id
132+
而且 sendemail节点包含PNG图片附件
133+
当 执行sendemail节点
134+
那么 PNG文件成功上传到飞书
135+
而且 飞书接收者收到PNG文件消息
136+
137+
场景: 飞书发送PDF格式附件
138+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
139+
而且 sendemail节点参数feishuTo配置了有效的open_id
140+
而且 sendemail节点包含PDF附件
141+
当 执行sendemail节点
142+
那么 PDF文件成功上传到飞书
143+
而且 飞书接收者收到PDF文件消息
144+
145+
场景: 飞书发送Markdown格式附件
146+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
147+
而且 sendemail节点参数feishuTo配置了有效的open_id
148+
而且 sendemail节点包含Markdown附件
149+
当 执行sendemail节点
150+
那么 Markdown文件成功上传到飞书
151+
而且 飞书接收者收到Markdown文件消息
152+
153+
场景: sendemail节点无附件时,飞书仅发送文本主题消息
154+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
155+
而且 sendemail节点参数feishuTo配置了有效的open_id
156+
而且 sendemail节点无附件(仅邮件正文)
157+
当 执行sendemail节点
158+
那么 飞书接收者仅收到文本消息
159+
而且 不发送任何文件消息
160+
161+
场景: sendemail节点含多个附件时,每个附件分别发送文件消息
162+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
163+
而且 sendemail节点参数feishuTo配置了有效的open_id
164+
而且 sendemail节点包含3个附件(CSV、Excel、PNG)
165+
当 执行sendemail节点
166+
那么 飞书接收者收到1条文本消息和3条文件消息
167+
而且 每个文件消息对应一个附件
168+
169+
# ============================================================
170+
# 场景5: 配置校验
171+
# ============================================================
172+
173+
场景: 飞书启用但appId为空时,sendemail节点执行失败
174+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
175+
而且 wds.dss.appconn.feishu.app.id为空
176+
而且 sendemail节点参数feishuTo配置了有效的open_id
177+
当 执行sendemail节点
178+
那么 抛出IllegalArgumentException
179+
而且 异常消息包含"app.id is not configured"
180+
而且 sendemail节点状态为失败
181+
182+
场景: 飞书启用但appSecret为空时,sendemail节点执行失败
183+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
184+
而且 wds.dss.appconn.feishu.app.secret为空
185+
而且 sendemail节点参数feishuTo配置了有效的open_id
186+
当 执行sendemail节点
187+
那么 抛出IllegalArgumentException
188+
而且 异常消息包含"app.secret is not configured"
189+
而且 sendemail节点状态为失败
190+
191+
# ============================================================
192+
# 场景6: 异常处理
193+
# ============================================================
194+
195+
场景: 邮件发送失败时,不执行飞书发送
196+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
197+
而且 sendemail节点参数feishuTo配置了有效的open_id
198+
而且 邮件发送因SMTP异常而失败
199+
当 执行sendemail节点
200+
那么 不执行飞书发送
201+
而且 sendemail节点状态为失败
202+
而且 错误消息包含"发送邮件失败"
203+
204+
场景: 飞书Token获取失败时,sendemail节点执行失败
205+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
206+
而且 飞书appId或appSecret无效
207+
而且 sendemail节点参数feishuTo配置了有效的open_id
208+
当 执行sendemail节点
209+
那么 邮件发送成功
210+
而且 飞书Token获取失败
211+
而且 抛出EmailSendFailedException(80002)
212+
而且 sendemail节点状态为失败
213+
而且 错误消息包含"飞书发送失败"
214+
215+
场景: 飞书文件上传失败时,sendemail节点执行失败
216+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
217+
而且 sendemail节点参数feishuTo配置了有效的open_id
218+
而且 飞书文件上传API返回错误
219+
当 执行sendemail节点
220+
那么 邮件发送成功
221+
而且 飞书主题文本消息发送成功
222+
而且 飞书附件上传失败
223+
而且 抛出EmailSendFailedException(80007)
224+
而且 sendemail节点状态为失败
225+
226+
场景: 向无效open_id发送飞书消息时,sendemail节点执行失败
227+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
228+
而且 sendemail节点参数feishuTo包含无效的open_id
229+
当 执行sendemail节点
230+
那么 邮件发送成功
231+
而且 飞书API返回接收者无效错误
232+
而且 抛出EmailSendFailedException(80004)
233+
而且 sendemail节点状态为失败
234+
235+
# ============================================================
236+
# 场景7: Token缓存与刷新
237+
# ============================================================
238+
239+
场景: 首次飞书发送时获取Tenant Token
240+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
241+
而且 飞书应用配置正确
242+
而且 Tenant Token缓存为空
243+
而且 sendemail节点参数feishuTo配置了有效的open_id
244+
当 执行sendemail节点
245+
那么 请求飞书Token API获取tenant_access_token
246+
而且 Token被缓存到内存
247+
而且 飞书消息发送成功
248+
249+
场景: Token未过期时使用缓存,不重新请求
250+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
251+
而且 已获取过Tenant Token且未过期
252+
而且 sendemail节点参数feishuTo配置了有效的open_id
253+
当 执行sendemail节点
254+
那么 使用缓存的Token发送飞书消息
255+
而且 不发起新的Token API请求
256+
257+
场景: Token过期时自动刷新
258+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
259+
而且 已获取过Tenant Token但已过期
260+
而且 sendemail节点参数feishuTo配置了有效的open_id
261+
当 执行sendemail节点
262+
那么 自动请求新的Tenant Token
263+
而且 新Token被缓存
264+
而且 飞书消息发送成功
265+
266+
# ============================================================
267+
# 场景8: 附件上传模式
268+
# ============================================================
269+
270+
场景: 附件有File引用时,直接使用File上传到飞书
271+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
272+
而且 sendemail节点参数feishuTo配置了有效的open_id
273+
而且 附件的getFile()返回存在的File对象
274+
当 执行sendemail节点
275+
那么 直接使用File对象上传到飞书
276+
而且 不创建临时文件
277+
278+
场景: 附件无File引用时,使用Base64解码临时文件上传
279+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
280+
而且 sendemail节点参数feishuTo配置了有效的open_id
281+
而且 附件的getFile()返回null
282+
而且 附件的getBase64Str()返回合法的Base64编码
283+
当 执行sendemail节点
284+
那么 将Base64解码后写入临时文件
285+
而且 使用临时文件上传到飞书
286+
而且 上传完成后临时文件被删除
287+
288+
场景: 附件Base64非法时,上传失败并抛出异常
289+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
290+
而且 sendemail节点参数feishuTo配置了有效的open_id
291+
而且 附件的getFile()返回null
292+
而且 附件的getBase64Str()返回非法Base64字符串
293+
当 执行sendemail节点
294+
那么 Base64解码失败
295+
而且 临时文件在finally块中被清理
296+
而且 抛出异常
297+
298+
# ============================================================
299+
# 场景9: 自定义飞书API地址
300+
# ============================================================
301+
302+
场景: 配置自定义飞书API地址时,请求发送到自定义地址
303+
假如 DSS配置wds.dss.appconn.feishu.enabled=true
304+
而且 wds.dss.appconn.feishu.api.base.url=https://custom-proxy.example.com/open-apis
305+
而且 sendemail节点参数feishuTo配置了有效的open_id
306+
当 执行sendemail节点
307+
那么 飞书API请求发送到自定义地址
308+
而且 飞书消息发送成功
309+
310+
# ============================================================
311+
# 场景10: 兼容性验证
312+
# ============================================================
313+
314+
场景: 未升级配置的现有sendemail节点不受影响
315+
假如 DSS未配置任何飞书相关配置项(使用默认值)
316+
而且 sendemail节点未配置feishuTo参数
317+
而且 sendemail节点包含邮件主题和附件
318+
当 执行sendemail节点
319+
那么 邮件发送成功
320+
而且 不执行任何飞书相关逻辑
321+
而且 sendemail节点行为与升级前完全一致

0 commit comments

Comments
 (0)