美文网首页
使用python自动生成报表以邮件发送

使用python自动生成报表以邮件发送

作者: overad | 来源:发表于2018-09-06 14:35 被阅读0次
    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Time : 2018/9/6 9:33
    # @Software: PyCharm
    
    
    #定义一个settings文件,配置信息都放在settings里面
    #定义链接数据库的常量
    HOST = 'localhost'
    USER = 'root'
    PWD = '**'
    PORT = 3306
    DB = '**'
    CHARSET = 'utf8'
    
    
    #定义发送邮件的常量
    SMTP_SSL_ADD = 'smtp.163.com'
    SMTP_SSL_PORT = 25
    
    #定义发送邮件的账号信息
    MY_EMAIL_ACCOUNT = ''       #账号
    MY_EMAIL_PASSWD = ''        #密码
    RECEIVE_LIST = []           #收件人列表
    
    
    #导入库
    import pymysql as pms
    import openpyxl
    import datetime
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    import smtplib
    import traceback
    
    #编写一个传入SQL就能返回对应数据的行数
    def get_datas(sql):
        #创建一个数据库的链接
        conn = pms.connect(host=HOST,user=USER,passwd=PWD,port=PORT,db=DB,charset=CHARSET)
    
        #创建一个游标,用来执行sql
        cur = conn.cursor()
    
        #使用execute执行sql
        #存在execute和executemany两个方法
        cur.execute(sql)
    
        #获取数据
        datas = cur.fetchall()
    
        #关闭连接
        cur.close()
    
        return datas
    
    #因为一个行数只能有一个返回值,所以可以用两个函数,一个行数返回数据,一个行数返回数据的字段;
    def get_fields(sql):
        conn = pms.connect(host=HOST, user=USER, passwd=PWD, port=PORT, db=DB, charset=CHARSET)
        cur = conn.cursor()
        cur.execute(sql)
    
        fields = cur.description
        cur.close()
    
        return fields
    
    
    #编写一个传入数据,字段名称,存储地址,返回一个excel的行数get_excel(data,field,file)
    def get_excel(data,field,file):
        #将数据和字段写入excel的函数
        #新建一个工作簿对象;
        new = openpyxl.Workbook()
    
        #激活一个新的sheet
        sheet = new.active
    
        #给新的sheet命名;
        sheet.title = '数据展示'
    
        #将字段循环写入到excel中;
        for col in range(len(field)):
            #row代表行数 #column代表列数 #value对标单元格输入的值;行数和列数都是从1开始;
            #写入表头,其中field是一个tuple。
            _ = sheet.cell(row=1,column=col+1,value=u'%s' % field[col][0])
            #将数据循环写入每个单元格
            for row in range(len(data)):
                for col in range(len(field)):
                    _ = sheet.cell(row=row+2,column=col+1,value=u'%s' % data[row][col])
    
        #将生产的数据保存;必须要保存
        newworkbook = new.save(file)
    
        return newworkbook
    
    
    #编写一个自动获取昨天日期字符串格式的函数getYesterday()
    def getYesterday():
        #获取昨天的日期的字符串函数
        #获取今天的日期
        today = datetime.date.today()
    
        #获取一天的日期格式数据
        oneday = datetime.timedelta(days=1)
    
        #昨天等于今天-1
        yesterday = today - oneday
    
        #获取昨天日期的格式化字符串
        yesterdaystr = yesterday.strftime('%Y-%m-%d')
    
        return yesterdaystr
    
    
    
    #生成一个邮件的函数;create_email
    #其实可以用第三方库yagmail发邮件;会简单一些;
    def create_mail(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')
    
        #读取附件的内容
        att1 = MIMEText(open(annex_path,'rb').read(),'base64','utf-8')
        att1['Content-Type'] = 'application/octet-stream'
    
        #生成附件的名称
        att1['Content-Disposition'] = 'attachment;filename=' + annex_name
    
        #将附件内容插入邮件中
        message.attach(att1)
    
        #返回邮件
        return message
    
    
    #生成一个发送邮件的函数
    def send_email(sender,passwd,receiver,msg):
        #一个输入邮箱、密码、发件人、邮件内容发送邮件的函数
        try:
            #找到你的发送邮箱的服务器地址,以加密的形式发送
            server = smtplib.SMTP_SSL(SMTP_SSL_ADD,SMTP_SSL_PORT) #发件人邮箱的SMTP服务器
            server.ehlo()
    
            #登陆你的账号;
            server.login(sender,passwd) #括号中对应的是发件人邮箱账号,邮箱密码
            #发送邮件;
            server.sendmail(sender,receiver,msg.as_string())
            print("邮件发送成功!")
            server.quit()
        except Exception:
            #traceback.print_exc()
            print(traceback.print_exc())
            print("邮件发送失败")
    
    
    
    #顶一个一个mail函数,把所有的自定义内容输入进去,最后执行main函数
    
    def main(sql):
        print(datetime.datetime.now())
    
        #生成数据
        my_data = get_datas(sql)
        my_field = get_fields(sql)
    
        #得到昨天的日期
        yesterdaystr = getYesterday()
    
        #文件名称
        my_file_name = 'overdue_' + yesterdaystr + '.xlsx'
    
        #文件路径
        file_path = 'D:/backup/pypath/' + my_file_name
    
        #生成exel
        get_excel(my_data,my_field,file_path)
    
    
        my_email_from = 'BI部门自动报表机器人'
        my_email_to = '运营部'
    
        #邮件标题
        my_email_Subject = 'overdue' + yesterdaystr
    
        #邮件正文
        my_email_text = "Dear all, \n\t附件为每周数据,请查收! \n\nBI团队" + yesterdaystr
    
        #附件地址
        my_annex_path = file_path
    
        #附件名称
        my_annex_name = my_file_name
    
        #生成邮件
        my_msg = create_mail(my_email_from, my_email_to, my_email_Subject,
                             my_email_text, my_annex_path, my_annex_name)
    
        my_sender = MY_EMAIL_ACCOUNT ---'我的邮箱账号'
        my_password = MY_EMAIL_PASSWD --'我的邮箱密码'
    
        my_receiver = RECEIVE_LIST #接受人列表
    
        #发送邮件
        send_email(my_sender, my_password, my_receiver, my_msg)
        print(datetime.datetime.now())
    
    if __name__ == '__main__':
        #可以把sql的语句放到配置文件中,也可以写入到函数中;
        sql = 'select * from car_total limit 10'
        main(sql)
    
    
    

    相关文章

      网友评论

          本文标题:使用python自动生成报表以邮件发送

          本文链接:https://www.haomeiwen.com/subject/zprxgftx.html