本文目录导读:

将脚本结果通知集成到钉钉或邮件,主要分为两种方式:主动推送(脚本主动发送消息)和被动接收(通过外部工具订阅),根据你的脚本运行环境(如本地、服务器、CI/CD等),可以选择以下标准方案。
钉钉通知集成
钉钉最常用的是 自定义机器人 Webhook,其次是 群机器人(Outgoing 模式,通常用于交互),这里重点介绍 Webhook。
获取钉钉机器人 Webhook URL
- 在钉钉电脑版,进入目标群聊。
- 点击群设置 → 智能群助手 → 添加机器人。
- 选择 自定义(通过 Webhook 接入)。
- 设置机器人名称、头像,并勾选“安全设置”(推荐使用“加签”,最安全)。
- 加签方式:点击“加签”,复制密钥(Secret)。
- 创建成功后,会得到一个类似如下的 Webhook 地址:
https://oapi.dingtalk.com/robot/send?access_token=xxx
在脚本中发送通知(Python 示例)
假设你的脚本是一个 Python 脚本(script.py),当它执行完毕后,将结果发送到钉钉。
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
# 你的 Webhook URL 和密钥
webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
secret = "YOUR_SECRET" # 如果没有加签,就不需要此变量
def send_dingtalk_message(content, msg_type="text"):
"""
发送钉钉消息(支持加签)
:param content: 消息内容(字符串)
:param msg_type: "text" 或 "markdown"
"""
# 1. 处理加签(如果配置了 secret)
if secret:
timestamp = str(round(time.time() * 1000))
string_to_sign = f"{timestamp}\n{secret}"
hmac_code = hmac.new(
secret.encode("utf-8"),
string_to_sign.encode("utf-8"),
digestmod=hashlib.sha256
).digest()
sign = urllib.parse.quote(base64.b64encode(hmac_code).decode("utf-8"))
webhook_url_with_sign = f"{webhook_url}×tamp={timestamp}&sign={sign}"
else:
webhook_url_with_sign = webhook_url
# 2. 构建消息体
headers = {"Content-Type": "application/json"}
if msg_type == "text":
payload = {
"msgtype": "text",
"text": {
"content": f"脚本通知:{content}"
}
}
else: # markdown
payload = {
"msgtype": "markdown",
"markdown": {
"title": "脚本执行报告",
"text": f"## 脚本结果\n\n{content}"
}
}
# 3. 发送
response = requests.post(webhook_url_with_sign, json=payload, headers=headers)
print(f"钉钉通知发送状态: {response.status_code}")
return response.json()
# ================== 在你的脚本中使用 ==================
if __name__ == "__main__":
# 假设这是你的脚本逻辑
result = "成功!数据量:1500 行"
error = None
if error:
final_content = f"❌ 脚本执行失败:{error}"
else:
final_content = f"✅ 脚本执行成功\n结果:{result}"
# 发送普通文本消息
send_dingtalk_message(final_content, msg_type="text")
# 或者发送 Markdown 消息(更美观)
# send_dingtalk_message(f"**状态**: {final_content}\n\n> 时间:{time.ctime()}", msg_type="markdown")
其他语言(Shell、Node.js、Go 等)
- Shell:可以用
curl命令直接 Post。#!/bin/bash webhook_url="https://oapi.dingtalk.com/robot/send?access_token=xxx" # 发送文本消息 curl "$webhook_url" -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"脚本执行完毕"}}' - Node.js:使用
axios或node-fetch,逻辑同上。
邮件通知集成
邮件通知通常使用 SMTP 协议 发送,你需要准备一个邮箱账号(发件人),以及对应的 SMTP 配置。
获取 SMTP 配置
- QQ邮箱:设置 → 账户 → 开启 SMTP 服务 → 生成授权码(作为密码)。
- 163邮箱:设置 → POP3/SMTP/IMAP → 开启服务 → 设置客户端授权密码。
- 企业微信/阿里云企业邮箱:通常有专门的 SMTP 服务器地址(如
smtp.qiye.aliyun.com)。
在脚本中发送邮件(Python 示例)
使用 Python 标准库 smtplib 和 email。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
# SMTP 配置(请替换为你自己的)
smtp_server = "smtp.qq.com" # smtp.qq.com, smtp.163.com
smtp_port = 465 # SSL端口一般是465
sender_email = "your_email@qq.com"
sender_password = "你的授权码(不是登录密码)"
receiver_emails = ["receiver1@qq.com", "receiver2@qq.com"] # 可以发给多个人
def send_email(subject, body, file_paths=None):
"""
发送邮件
:param subject: 邮件主题
:param body: 邮件正文(支持HTML)
:param file_paths: 附件路径列表(可选)
"""
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = ", ".join(receiver_emails)
msg['Subject'] = subject
# 添加正文
msg.attach(MIMEText(body, 'html', 'utf-8')) # 使用 'html' 可以发富文本
# 添加附件(可选)
if file_paths:
for file_path in file_paths:
with open(file_path, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header(
'Content-Disposition',
f'attachment; filename= {file_path.split("/")[-1]}'
)
msg.attach(part)
# 连接服务器并发送
try:
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender_email, sender_password)
server.send_message(msg)
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
# ================== 在你的脚本中使用 ==================
if __name__ == "__main__":
# 假设脚本逻辑
script_result = "数据处理完成,成功200条,失败0条。"
# 构建 HTML 邮件内容
email_body = f"""
<h2>脚本执行报告</h2>
<p><b>状态:</b> 成功</p>
<p><b>结果:</b> {script_result}</p>
<hr>
<p>自动发送,无需回复。</p>
"""
# 发送(无附件)
send_email(
subject=f"[脚本通知] 数据处理结果 - {time.strftime('%Y-%m-%d %H:%M')}",
body=email_body
)
# 如果需要发送日志文件作为附件
# send_email(subject="报告", body="详见附件", file_paths=["/tmp/log.txt"])
更完善的集成方式
如果你的脚本是在特定平台运行的,还可以利用平台的“通知渠道”功能,无需自己写代码:
GitHub Actions / GitLab CI / Jenkins
- GitHub Actions:在 Workflow 的
steps后,使用actions/checkout后,添加一个run步骤来调用上面的钉钉或邮件脚本,更简单的方法是,使用 DingTalk action(如mdluo/dingtalk-action)或 Jenkins 的 Email Extension Plugin。 - Jenkins:内置邮件通知插件 (
Email Extension),配置 SMTP 服务器后,在 Job 的 Post-build Actions 中勾选“E-mail Notification”,或者在 Pipeline 中用emailext步骤。
监控告警平台(推荐用于长期运行的脚本)
- Prometheus + Alertmanager:脚本暴露指标,Alertmanager 可以根据规则发送钉钉(webhook_receiver)或邮件。
- 自建告警系统:使用 Python 脚本监听任务队列,如果脚本失败,自动调用钉钉/邮件。
最佳实践建议
- 区分环境:开发环境只发邮件或日志,生产环境才发钉钉(因为钉钉比较打扰)。
- 失败重试:网络波动可能导致通知发送失败,建议加一个简单的重试逻辑(例如重试3次,间隔2秒)。
- 安全:
- 不要将
access_token和secret硬编码在脚本中,使用环境变量(如os.getenv("DINGTALK_TOKEN"))。 - 邮件密码使用授权码,而非邮箱密码。
- 不要将
- 格式化结果:
- 钉钉:推荐使用 Markdown 格式,可以加颜色/列表。
- 邮件:使用 HTML 表格,清晰展示关键字段(时间、状态、影响范围、错误细节)。
选择钉钉还是邮件,取决于你的团队习惯。钉钉适合 即时告警(人随时看手机),邮件适合 详细报告(需要附件和格式),你可以两者同时使用,钉钉通知概要,邮件发送完整日志。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播