You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现IDMC作业失败时的邮件通知?

实现方案

一、增强Python脚本的异常通知逻辑

在现有查询脚本基础上,添加状态判断和邮件发送模块,核心逻辑是:获取作业运行数据后筛选出Failed/Suspended的记录,若存在这类异常记录则触发邮件通知。

示例代码片段

假设你已有get_idmc_job_runs()函数返回作业数据,新增邮件发送逻辑如下:

import smtplib
import os
from email.mime.text import MIMEText
from email.header import Header

def send_failure_notification(abnormal_jobs):
    # 从环境变量读取邮件配置(避免硬编码敏感信息)
    smtp_server = os.getenv("SMTP_SERVER")
    sender_email = os.getenv("SENDER_EMAIL")
    email_password = os.getenv("EMAIL_PASSWORD")
    receiver_emails = os.getenv("RECEIVER_EMAILS").split(",")

    # 构造清晰的邮件内容
    email_content = "发现IDMC作业异常运行记录:\n\n"
    for job in abnormal_jobs:
        email_content += (
            f"RunID: {job['runID']}\n"
            f"作业名称: {job['runName']}\n"
            f"状态: {job['Status']}\n"
            f"运行日期: {job['日期']}\n\n"
        )
    
    msg = MIMEText(email_content, 'plain', 'utf-8')
    msg['From'] = Header("IDMC作业监控通知", 'utf-8')
    msg['To'] = Header(",".join(receiver_emails), 'utf-8')
    msg['Subject'] = Header("IDMC作业异常警报", 'utf-8')

    # 发送邮件
    try:
        # 根据SMTP服务器类型选择连接方式(SSL/非SSL)
        if os.getenv("SMTP_USE_SSL") == "true":
            with smtplib.SMTP_SSL(smtp_server, 465) as server:
                server.login(sender_email, email_password)
                server.sendmail(sender_email, receiver_emails, msg.as_string())
        else:
            with smtplib.SMTP(smtp_server, 25) as server:
                server.starttls()
                server.login(sender_email, email_password)
                server.sendmail(sender_email, receiver_emails, msg.as_string())
        print("异常通知邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败: {str(e)}")
        # 抛出异常让流水线捕获,标记任务失败
        raise

# 主逻辑
if __name__ == "__main__":
    # 调用现有函数获取作业运行数据
    job_runs = get_idmc_job_runs()
    # 筛选异常状态的作业
    abnormal_jobs = [job for job in job_runs if job['Status'] in ('Failed', 'Suspended')]
    
    if abnormal_jobs:
        send_failure_notification(abnormal_jobs)
        # 返回非0退出码,让流水线标记为失败(可选)
        exit(1)
    else:
        print("所有IDMC作业运行正常")

二、Azure DevOps流水线配置调整

1. 配置敏感变量

在流水线的变量面板中,添加以下保密变量(勾选"保密"选项避免明文泄露):

  • SMTP_SERVER: 内部SMTP服务器地址
  • SENDER_EMAIL: 发送通知的邮箱地址
  • EMAIL_PASSWORD: 邮箱密码或应用专用令牌
  • RECEIVER_EMAILS: 收件人邮箱列表(用逗号分隔)
  • SMTP_USE_SSL: 可选,设为true或false指定连接方式

2. 调整流水线任务

假设你的流水线用Bash或PythonScript任务运行脚本,需做以下调整:

  • 若使用第三方邮件库(如yagmail),添加依赖安装步骤:
    pip install yagmail
    
  • 将流水线变量注入脚本的环境变量,以Bash任务为例,在任务的"环境变量"中添加:
    SMTP_SERVER=$(SMTP_SERVER)
    SENDER_EMAIL=$(SENDER_EMAIL)
    EMAIL_PASSWORD=$(EMAIL_PASSWORD)
    RECEIVER_EMAILS=$(RECEIVER_EMAILS)
    SMTP_USE_SSL=$(SMTP_USE_SSL)
    
  • 执行脚本的命令保持不变:
    python your_monitor_script.py
    

3. 保留每日调度

维持原有流水线的触发器配置(每日定时运行),确保脚本自动执行并完成状态检查。

三、可选优化

  • 邮件格式升级: 将邮件内容改为HTML格式,用表格展示异常作业,提升可读性
  • 流水线状态联动: 脚本检测到异常时返回非0退出码,让流水线标记为"失败",配合Azure DevOps的流水线通知功能实现双重提醒
  • 日志增强: 用Pythonlogging模块记录API查询、邮件发送的详细日志,方便排查问题

内容的提问来源于stack exchange,提问作者Abdelrahman Youssef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:03:18