如何用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的流水线通知功能实现双重提醒
- 日志增强: 用Python
logging模块记录API查询、邮件发送的详细日志,方便排查问题
内容的提问来源于stack exchange,提问作者Abdelrahman Youssef
相关产品推荐
相关产品推荐

