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

Python邮件正文构建难题:如何将多IP整合至同一邮件

解决方案:统一收集故障IP后发送单封邮件

嘿,作为Python新手能写出可运行的监控脚本已经很棒啦!现在咱们把“每个故障IP发一封邮件”改成“所有故障IP攒一起发一封”,其实只需要调整一下逻辑顺序就行:

修改后的完整代码(ping.py)

#!/usr/bin/env python
import smtplib
import pyping
from conf import settings, sites
import datetime

def send_alert_email(down_sites):
    """发送包含所有故障IP的告警邮件"""
    sender = settings["monitor_email"]
    recipient = settings["recipient_email"]
    subject = f"【站点告警】{len(down_sites)}个IP无法访问 ({datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')})"
    
    # 构建整合式邮件正文
    body = f"检测到以下IP地址无法正常访问:\n\n"
    for ip in down_sites:
        body += f"- {ip}\n"
    body += f"\n检测时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"

    # 组装符合SMTP标准的邮件内容
    message = f"From: {sender}\nTo: {recipient}\nSubject: {subject}\n\n{body}"

    try:
        with smtplib.SMTP(settings["smtp_server"], settings["smtp_port"]) as server:
            # 若SMTP服务器需要认证,取消下面两行注释并配置参数
            # server.login(settings["smtp_username"], settings["smtp_password"])
            server.sendmail(sender, recipient, message)
        print(f"告警邮件已发送,共{len(down_sites)}个故障IP")
    except Exception as e:
        print(f"发送邮件失败:{str(e)}")

def main():
    down_sites = []
    # 遍历所有站点,统一收集故障IP
    for site in sites:
        try:
            response = pyping.ping(site, timeout=3)
            if not response.success:
                down_sites.append(site)
                print(f"IP {site} 无法访问")
        except Exception as e:
            down_sites.append(site)
            print(f"检测IP {site} 时出错:{str(e)}")
    
    # 仅当存在故障IP时发送邮件
    if down_sites:
        send_alert_email(down_sites)
    else:
        print("所有站点均正常,无需发送告警")

if __name__ == "__main__":
    main()

关键修改点说明

  • 故障IP统一收集:新增down_sites列表,把所有ping失败或检测出错的IP都存进去,替代原来“检测一个发一个”的逻辑
  • 延迟邮件触发时机:把发送邮件的代码封装成独立函数,等全部站点检测完成后,判断存在故障IP才触发发送
  • 优化邮件可读性:邮件主题明确标注故障数量和检测时间,正文用列表清晰列出所有故障IP,让收件人一眼掌握全部问题
  • 增强异常处理:把单个IP检测时的异常也纳入故障收集,避免脚本中途中断

小提示

如果你的SMTP服务器需要认证(比如国内主流邮箱),记得取消代码中server.login的注释,并在settings配置文件中补充SMTP用户名和密码哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:40:00