使用Java发送飞书和邮件格式
飞书 & 邮件通知开发接入规范(Java)
适用场景:预警通知、任务提醒、系统告警等
目标:统一通知格式、减少渲染问题、可直接交付开发使用
一、整体设计原则(强约束)
1. 飞书使用 Post 富文本(JSON),不使用纯文本
2. 邮件统一使用 HTML,禁止 text/plain
3. 所有通知内容 变量化,禁止字符串拼接
4. 渲染问题优先保证:可读性 > 花哨样式
二、飞书通知(Post 富文本)
2.1 支持能力说明
飞书机器人支持以下主要格式:
text(纯文本,不推荐)
post(富文本,推荐)
card(交互卡片,当前项目不建议引入)
本项目 统一使用 post 富文本,类 Markdown,但本质是 JSON 结构
2.2 Post 富文本结构说明
基础结构:
{
"msg_type": "post",
"content": {
"post": {
"zh_cn": {
"title": "预警通知",
"content": []
}
}
}
}
2.3 常用元素写法(开发重点)
1️⃣ 标题
{
"tag": "text",
"text": "【严重】系统预警",
"style": {
"bold": true
}
}
2️⃣ 普通文本
{
"tag": "text",
"text": "命中规则:RULE_001"
}
3️⃣ 换行
{
"tag": "text",
"text": "\n"
}
4️⃣ 字段列表(推荐结构)
[
{ "tag": "text", "text": "规则名称:" , "style": {"bold": true}},
{ "tag": "text", "text": "高风险交易监测" }
]
2.4 飞书完整示例(可直接用)
{
"msg_type": "post",
"content": {
"post": {
"zh_cn": {
"title": "预警通知",
"content": [
[
{"tag":"text","text":"【中风险】交易预警","style":{"bold":true}}
],
[
{"tag":"text","text":"规则编码:" ,"style":{"bold":true}},
{"tag":"text","text":"RULE_001"}
],
[
{"tag":"text","text":"触发时间:" ,"style":{"bold":true}},
{"tag":"text","text":"2026-01-21 15:30:00"}
],
[
{"tag":"text","text":"说明:" ,"style":{"bold":true}},
{"tag":"text","text":"近30分钟交易频率异常"}
]
]
}
}
}
}
2.5 飞书注意事项(踩坑总结)
❌ 不支持 HTML
❌ 不支持真正的 Markdown
✅ 所有内容必须是 JSON 节点
✅ 样式仅支持:bold / a(链接)
三、邮件通知(HTML)
3.1 邮件发送强制规范
必须使用 HTML(
text/html)Subject 单独设置,不写在 HTML 中
使用
MimeMessageHelper.setText(html, true)
3.2 Java 标准发送方式(固定写法)
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setTo(toEmail);
helper.setSubject("【预警通知】系统异常告警");
helper.setText(htmlContent, true);
mailSender.send(message);
3.3 HTML 模板结构(推荐)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>预警通知</title>
</head>
<body style="margin:0;padding:0;background-color:#f5f7fa;font-family:Arial,Helvetica,sans-serif;">
<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f5f7fa;padding:20px 0;">
<tr>
<td align="center">
<table width="720" cellpadding="0" cellspacing="0"
style="background-color:#ffffff;border-radius:6px;overflow:hidden;box-shadow:0 2px 6px rgba(0,0,0,0.05);">
<!-- Header -->
<tr>
<td style="background-color:#1f6feb;color:#ffffff;padding:16px 24px;">
<span style="font-size:18px;font-weight:bold;">系统预警通知</span>
</td>
</tr>
<!-- Content -->
<tr>
<td style="padding:24px;color:#333333;font-size:14px;line-height:1.6;">
<!-- 基础预警信息 -->
<div style="margin-bottom:24px;">
<div style="font-size:15px;font-weight:bold;margin-bottom:12px;">
一、基础预警信息
</div>
<table width="100%" cellpadding="6" cellspacing="0"
style="border-collapse:collapse;">
<tr>
<td width="140" style="color:#666;">预警等级:</td>
<td><strong style="color:#d93026;">${alertLevel}</strong></td>
</tr>
<tr>
<td style="color:#666;">预警时间:</td>
<td>${alertTime}</td>
</tr>
<tr>
<td style="color:#666;">异常编码:</td>
<td>${errorCode}</td>
</tr>
<tr>
<td style="color:#666;">异常类型:</td>
<td>${errorType}</td>
</tr>
<tr>
<td style="color:#666;">预警频次:</td>
<td>${alertFrequency}</td>
</tr>
<tr>
<td style="color:#666;">触发条件:</td>
<td>累计 <strong>${triggerCount}</strong> 条异常触发</td>
</tr>
</table>
</div>
<!-- 业务关联信息 -->
<div>
<div style="font-size:15px;font-weight:bold;margin-bottom:12px;">
二、业务关联信息
</div>
<table width="100%" cellpadding="6" cellspacing="0"
style="border-collapse:collapse;">
<tr>
<td width="140" style="color:#666;">关联申请 ID:</td>
<td>${applyId}</td>
</tr>
<tr>
<td style="color:#666;vertical-align:top;">预警详情:</td>
<td>
<div style="margin-bottom:6px;">预警平台:${alertPlatform}</div>
<div style="margin-bottom:6px;">异常一级模块:${errorModuleLevel1}</div>
<div style="margin-bottom:6px;">异常二级模块 / 接口:${errorModuleLevel2}</div>
<div>接口路径:${apiPath}</div>
</td>
</tr>
</table>
</div>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="background-color:#fafafa;color:#999999;font-size:12px;
padding:12px 24px;text-align:center;">
本邮件由系统自动发送,请勿直接回复
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
| 变量名 | 含义 |
|---|---|
${alertLevel} |
预警等级(P1 / P2 …) |
${alertTime} |
预警时间 |
${errorCode} |
异常编码 |
${errorType} |
异常类型 |
${alertFrequency} |
预警频次 |
${triggerCount} |
触发异常条数 |
${applyId} |
关联申请 ID |
${alertPlatform} |
预警平台 |
${errorModuleLevel1} |
异常一级模块 |
${errorModuleLevel2} |
异常二级模块 / 接口 |
${apiPath} |
接口路径 |
3.4 变量替换规范(必须)
使用
${xxx}占位符后端统一通过模板引擎或 replace 处理
禁止直接字符串拼接 HTML
示例:
htmlTemplate
.replace("${alertLevel}", alertLevel)
.replace("${alertTime}", alertTime)
...
3.5 常见问题说明
Q1:<title> 被直接展示?
原因:邮件被当成 text/plain 发送
解决:
helper.setText(html, true);
Q2:样式在部分邮箱失效?
邮件客户端不支持外链 CSS
所有样式必须写在 style 属性中
四、最终交付约定
预警通知统一采用:
- 飞书:Post 富文本格式
- 邮件:HTML 模板方式
后端需严格按照本文档规范实现,避免渲染不一致问题。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu