本文目录导读:

将脚本结果通知集成到钉钉或邮件,主要分为两种方式:主动推送(脚本主动发送消息)和被动接收(通过外部工具订阅),根据你的脚本运行环境(如本地、服务器、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 表格,清晰展示关键字段(时间、状态、影响范围、错误细节)。
选择钉钉还是邮件,取决于你的团队习惯。钉钉适合 即时告警(人随时看手机),邮件适合 详细报告(需要附件和格式),你可以两者同时使用,钉钉通知概要,邮件发送完整日志。