使用Java发送飞书和邮件格式

AI摘要
本文是一份面向Java开发者的技术规范文档,属于【知识分享】。它详细规定了在预警通知、任务提醒等场景下,如何统一使用飞书机器人的Post富文本(JSON结构)和邮件的HTML模板进行通知开发。文档明确了强制设计原则、两种通知方式的具体实现结构、代码示例、变量替换规范以及常见问题的规避方法,旨在确保通知格式统一、渲染稳定,并可直接交付开发使用。

飞书 & 邮件通知开发接入规范(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 邮件发送强制规范

  • 必须使用 HTMLtext/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 协议》,转载必须注明作者和本文链接
每天一点小知识,到那都是大佬,哈哈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php @ 远程
文章
82
粉丝
16
喜欢
76
收藏
87
排名:526
访问:1.5 万
私信
所有博文
社区赞助商