python 文件对比并发送邮件

Posted jianeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 文件对比并发送邮件相关的知识,希望对你有一定的参考价值。

#!/usr/local/python3
# -*- coding: utf-8 -*-
# @Date    : 2018-04-15 09:00:00
# @Author  : Canon
# @Link    : https://www.python.org
# @Version : 3.6.1

"""
python sys.argv[0] sys.argv[1]
sys.argv[0]: 脚本路径
sys.argv[1]: 项目名称

执行脚本示例:
python conf_warn.py 项目名称

"""

import os
import sys
import difflib
import smtplib
from email.mime.text import MIMEText


# 项目名称
program_name = sys.argv[1].lower()

# 项目集合
proj_dict = {}

# ---------- 发送邮件相关参数------
# 发件服务器
smtp_server = "smtp.exmail.qq.com"
# 端口
port = 465
# 账号
sender = "[email protected]"
# 密码
psw = "BjF792SFx4FyJEgo"
# 接收人
receiver = ["[email protected]", "[email protected]"]

# ---------- 检查是否存在配置以下文件, 若存在, 则发送邮件 ------
# 项目检查文件
proj_as = [web.xml, ehcache.xml, log4j.xml, struts.xml]# 所有项目
proj_list = [
    {
        "proj_name": "项目名称",
        "patch_file": "镜像包路径",
        "target_path": [目标路径1, 目标路径2],
        "conf_file": proj_as,
        "compare_path": ""}
]

for item in proj_list:
    # 清除对比目录下的文件
    os.system("rm -rf {0}/*".format(item["compare_path"]))
    # 获取项目信息
    if item["proj_name"].lower() == program_name:
        proj_dict = item

# 解压镜像包文件
os.system("tar -zxf {0} -C {1}".format(""+proj_dict["patch_file"]+"", proj_dict["compare_path"]))

# 获取对比路径下所有的文件
compare_dir = {}
for root, dirs, files in os.walk(proj_dict["compare_path"], topdown=False):
    for name in files:
        if name in proj_dict["conf_file"]:
            print(name)
            file_path = os.path.join(root, name)
            compare_dir[name] = file_path

# 镜像包中存在的配置文件列表
conf_list = [key for key in compare_dir]

compare_dict = {}
if conf_list:
    # 获取项目路径下所有的文件
    init_dir = {}
    for root, dirs, files in os.walk(proj_dict["target_path"][0], topdown=False):
        for name in files:
            if name in conf_list:
                file_path = os.path.join(root, name)
                init_dir[name] = file_path

                # 配置文件差异对比
                hd = difflib.HtmlDiff()
                init_strs = ‘‘
                with open(init_dir[name],r) as init:
                    init_strs = init.readlines()
                    init.close()

                compare_strs = ‘‘
                with open(compare_dir[name], r) as compare:
                    compare_strs = compare.readlines()
                    compare.close()

                content = hd.make_file(init_strs,compare_strs)
                compare_dict[name] = content

email_body = ‘‘‘<div>镜像更新包出现以下文件,需要测试人员进行人工检查:</div>
        <div>项目名称: {0}</div>
        <div>配置文件: {1}</div>‘‘‘.format(proj_dict["proj_name"], ", ".join(conf_list))
for html_key in  compare_dict:
    email_body = email_body + "<h1>{0}</h1><span>{1}</span>".format(html_key, compare_dict[html_key])

# 清除对比目录下的文件
for item in proj_list:
    os.system("rm -rf {0}/*".format(item["compare_path"]))

# ---------- 编辑邮件内容 ------
# 邮件内容
body = email_body
# 定义邮件正文为 html 格式
msg = MIMEText(body, "html", "utf-8")
# 发送人
msg[from] = sender
# 接收人
msg[to] = ";".join(receiver)
# 邮件标题
subject = "镜像环境, 配置文件检查"
msg[subject] = subject

# ---------- 发送邮件 ------
if conf_list:
    try:
        smtp = smtplib.SMTP()
        # 连接服务器
        smtp.connect(smtp_server)
        # 登录服务器
        smtp.login(sender, psw)
    except:
        # 连接服务器
        smtp = smtplib.SMTP_SSL(smtpserver, port)
        # 登录服务器
        smtp.login(sender, psw)

    # 发送邮件
    smtp.sendmail(sender, receiver, msg.as_string())
    # 关闭服务器
    smtp.quit()

 

以上是关于python 文件对比并发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

用python实现自动发邮件的功能

如果条件为true,则使用python代码发送邮件

用Python实现邮件发送Hive明细数据

Javascript - 使用 HTML 片段通过电子邮件发送 JSON 输出

Python3 实现简易ping监控并发送报警邮件

python编程:函数式编程和面向对象编程的对比