Python项目1:自动查询SQL后将多个结果导入Excel附件中发送邮件

分享下之前做的一些练手项目代码,供大家参考。

实现功能很简单,通过linux或windows平台的计划任务功能实现代码的自动触发,从而可实现任务定时执行。

任务是可以讲多个检索结果导成Excel自动编辑好邮件发送。

功能如下:

1、一个传入sql导出数据的函数,用来获取检索出来的结果

def get_datas(config,sql):
    # 一个传入sql导出数据的函数
    # 跟数据库建立连接
    conn = cx_Oracle.connect(config, nencoding='utf-8')
    # 使用 cursor() 方法创建一个游标对象 cursor
    cur = conn.cursor()
    # 使用 execute() 方法执行 SQL
    cur.execute(sql)
    # 获取所需要的数据
    datas = cur.fetchall()
    #关闭连接
    cur.close()
    #返回所需的数据
    return datas

2、一个用来获取导出检索的字段函数

def get_fields(config,sql):
    # 一个传入sql导出字段的函数
    #conn = cx_Oracle.connect("d4moddev/d4moddevap@172.18.7.31:1521/d3mesdb", nencoding='utf8')
    conn = cx_Oracle.connect(config, nencoding='utf8')
    cur = conn.cursor()
    cur.execute(sql)
    # 获取所需要的字段名称
    fields = cur.description
    cur.close()
    return fields

3、生成Excel,将之前获取的字段或者Value导入Excel中

def get_excel(data, field, file):
    # 将数据和字段名写入excel的函数
    #新建一个工作薄对象
    new = xlwt.Workbook(encoding='utf8')
    #激活一个新的sheet
    sheet = new.add_sheet("QueryResult")
    #将字段名称循环写入excel第一行,因为字段格式列表里包含列表,每个列表的第一元素才是字段名称
    for col in range(len(field)):
        #row代表行数,column代表列数,value代表单元格输入的值,行数和列数都是从1开始,这点于python不同要注意
            _ = sheet.write(1, col+1,  field[col][0])
     #将数据循环写入excel的每个单元格中
    for row in range(len(data)):
        for col in range(len(field)):
            #因为第一行写了字段名称,所以要从第二行开始写入
            _ = sheet.write(row+2, col + 1, data[row][col])
            #将生成的excel保存,这步是必不可少的
    newworkbook = new.save(file)
    #返回生成的excel
    return newworkbook

4、生成邮件,将输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件。

     注意多个文件需要放在同一文件路径引用。

def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name):
    # 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
    #生成一个空的带附件的邮件实例
    message = MIMEMultipart()
    #将正文以text的形式插入邮件中
    message.attach(MIMEText(email_text, 'plain', 'utf-8'))
    #生成发件人名称(这个跟发送的邮件没有关系)
    message['From'] = Header(email_from, 'utf-8')
    #生成收件人名称(这个跟接收的邮件也没有关系)
    message['To'] = Header(email_to, 'utf-8')
    #生成邮件主题
    message['Subject'] = Header(email_Subject, 'utf-8')
    #读取附件的内容
    for file in annex_name:
        if(os.path.isfile(annex_path+'/'+file)):
            #循环构造附件a
            att1 = MIMEText(open(annex_path+'/'+file, 'rb').read(), 'base64', 'utf-8')
            att1["Content-Type"] = 'application/octet-stream'
            # 生成附件的名称
            att1["Content-Disposition"] = 'attachment; filename=' + file
            # 将附件内容插入邮件中
            message.attach(att1)
    #返回邮件
    return message

 5、发送邮件方法。

def send_email(sender, password, receiver, msg):
    # 一个输入邮箱、密码、收件人、邮件内容发送邮件的函数
    try:
        #找到你的发送邮箱的服务器地址,已加密的形式发送
        server = smtplib.SMTP("whmail.csot.tcl.com")  # 发件人邮箱中的SMTP服务器
        # server.ehlo()
        # #登录你的账号
        # server.login(sender, password)  # 括号中对应的是发件人邮箱账号、邮箱密码
        #发送邮件
        server.sendmail(sender, receiver, msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号(是一个列表)、邮件内容
        print("邮件发送成功")
        server.quit()  # 关闭连接
    except Exception:
        print("邮件发送失败")

6、主函数

if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding("utf-8")
    print(datetime.datetime.now())
    # 得到昨天的日期
    todaystr = gettoday('A')
    yesterdaystr = getYesterday('A')
    beforeYesterdaystr = getTheDayBeforeYesterday('A')
    my_sql="""
 SELECT *
  FROM CT_AGVTRANSFERCOMMANDHISTORY C
 WHERE C.EVENTTIME BETWEEN
       TO_DATE('{}', 'yyyy-mm-dd hh24:mi:ss') AND
       TO_DATE('{}', 'yyyy-mm-dd hh24:mi:ss')
 ORDER BY C.TRANSPORTJOBNAME DESC
    """
    my_sql = my_sql.format(yesterdaystr+' 07:30:00', todaystr+' 07:30:00')
    # 生成数据
    my_data = get_datas(t4modproddb, my_sql)
    print(my_sql)
    # 生成字段名称
    my_field = get_fields(t4modproddb, my_sql)
    # 文件名称
    my_file_name = 'AgvInfo' + todaystr + '.xls'
    # 文件路径
    file_path = 'E:/TEST/' + my_file_name
    # 生成excel
    get_excel(my_data, my_field, file_path)

    ###############c重复执行sql############
    my_sql1 = """xxx
        """
    my_sql1 = my_sql1.format(getYesterday('B')+'073000', gettoday('B')+'073000')
    # 生成数据
    my_data1 = get_datas(t4logproddb, my_sql1)
    print(my_sql1)
    # 生成字段名称
    my_field1 = get_fields(t4logproddb, my_sql1)
    # 文件名称
    my_file_name1 = 'LogInfo' + todaystr + '.xls'
    # 文件路径
    file_path1 = 'E:/TEST/' + my_file_name1
    # 生成excel
    get_excel(my_data1, my_field1, file_path1)
    ################c重复执行sqlEND############
    my_email_from = 'MES自动数据查询'
    my_email_to = 'FA'
    # 邮件标题
    my_email_Subject = 'TransferCommandReport' + todaystr
    # 邮件正文
    my_email_text = "comment"
    # 附件地址
    my_annex_path = 'E:/TEST/'
    # 附件名称
    my_annex_name = [my_file_name , my_file_name1]
    # 生成邮件
    my_msg = create_email(my_email_from, my_email_to, my_email_Subject,
                          my_email_text, my_annex_path, my_annex_name)
    my_sender = 'xxx'
    my_password = xxx
    my_receiver = ['xxx']
    # 发送邮件
    send_email(my_sender, my_password, my_receiver, my_msg)
    print(datetime.datetime.now())

 

以上有一些信息做过删减。具体的使用格式可以自己多尝试。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值