脚本结果通知如何集成到钉钉或邮件

wen 实用脚本 2

本文目录导读:

脚本结果通知如何集成到钉钉或邮件

  1. 钉钉通知集成
  2. 邮件通知集成
  3. 更完善的集成方式
  4. 最佳实践建议

将脚本结果通知集成到钉钉或邮件,主要分为两种方式:主动推送(脚本主动发送消息)和被动接收(通过外部工具订阅),根据你的脚本运行环境(如本地、服务器、CI/CD等),可以选择以下标准方案。

钉钉通知集成

钉钉最常用的是 自定义机器人 Webhook,其次是 群机器人(Outgoing 模式,通常用于交互),这里重点介绍 Webhook。

获取钉钉机器人 Webhook URL

  1. 在钉钉电脑版,进入目标群聊。
  2. 点击群设置 → 智能群助手添加机器人
  3. 选择 自定义(通过 Webhook 接入)。
  4. 设置机器人名称、头像,并勾选“安全设置”(推荐使用“加签”,最安全)。
    • 加签方式:点击“加签”,复制密钥(Secret)。
  5. 创建成功后,会得到一个类似如下的 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}&timestamp={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:使用 axiosnode-fetch,逻辑同上。

邮件通知集成

邮件通知通常使用 SMTP 协议 发送,你需要准备一个邮箱账号(发件人),以及对应的 SMTP 配置。

获取 SMTP 配置

  • QQ邮箱:设置 → 账户 → 开启 SMTP 服务 → 生成授权码(作为密码)。
  • 163邮箱:设置 → POP3/SMTP/IMAP → 开启服务 → 设置客户端授权密码。
  • 企业微信/阿里云企业邮箱:通常有专门的 SMTP 服务器地址(如 smtp.qiye.aliyun.com)。

在脚本中发送邮件(Python 示例)

使用 Python 标准库 smtplibemail

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 脚本监听任务队列,如果脚本失败,自动调用钉钉/邮件。

最佳实践建议

  1. 区分环境:开发环境只发邮件或日志,生产环境才发钉钉(因为钉钉比较打扰)。
  2. 失败重试:网络波动可能导致通知发送失败,建议加一个简单的重试逻辑(例如重试3次,间隔2秒)。
  3. 安全
    • 不要将 access_tokensecret 硬编码在脚本中,使用环境变量(如 os.getenv("DINGTALK_TOKEN"))。
    • 邮件密码使用授权码,而非邮箱密码。
  4. 格式化结果
    • 钉钉:推荐使用 Markdown 格式,可以加颜色/列表。
    • 邮件:使用 HTML 表格,清晰展示关键字段(时间、状态、影响范围、错误细节)。

选择钉钉还是邮件,取决于你的团队习惯。钉钉适合 即时告警(人随时看手机),邮件适合 详细报告(需要附件和格式),你可以两者同时使用,钉钉通知概要,邮件发送完整日志。

抱歉,评论功能暂时关闭!