python连接MySQL数据库,查询数据后定时邮件发送数据

这是我第一次写的代码:python连接MySQL数据库,查询数据后定时邮件发送数据,纯python代码。

首先用python连接MySQL数据库,查询出数据后转成DataFrame格式数据,再制作成网页版,构建成邮件,设置好定时时间,直接可以多人发送。

python连接MySQL数据库,我连接是SSH连接MySQL数据库的;
python定时邮件发送。

话不多说直接上代码:

# 导入相关库-email
from email.mime.multipart import MIMEMultipart  # 构建邮件头信息,包括发件人,接收人,标题等
from email.mime.text import MIMEText  # 构建邮件正文,可以是text,也可以是HTML
from email.mime.application import MIMEApplication  # 构建邮件附件,理论上,只要是文件即可,一般是图片,Excel表格,word文件等
from email.header import Header  # 专门构建邮件标题的,这样做,可以支持标题中文


import  pymysql
import io
import pandas as pd
from sshtunnel import SSHTunnelForwarder
import datetime
import logging
import smtplib
import time
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr

from apscheduler.schedulers.background import BackgroundScheduler

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
import os
import datetime


def getYesterday(): 
    today=datetime.date.today() 
    oneday=datetime.timedelta(days=1) 
    yesterday=today-oneday
    return yesterday

def getToday(): 
    today=datetime.date.today() 
    return today

def getyindutime(): 
    today=(datetime.datetime.now()-datetime.timedelta(hours=2.5)).strftime('%Y-%m-%d %H:%M:%S')#过去2.5小时时间
    return today


def parseData():
    try:
        logging.info('%s, 日常订单财务数据操作开始' % getToday())
        
        server =  SSHTunnelForwarder(
            ("139.***.**.15", 22), #ssh IP和port
            ssh_password = "******",#ssh 密码
            ssh_username = "root",#ssh账号
            remote_bind_address = ("**********************", 3306)) #数据库所在的IP和端口


        #启动服务
        server.start()
        #打印本地端口,已检查是否配置正确
        #print(server.local_bind_host)

        goDB = pymysql.connect(host = "127.0.0.1", #固定写法
                       port = server.local_bind_port,
                       user = "*****", #数据库账号
                       passwd = "******")#数据库密码 
                       # db = "richcash")# 可以限定,只访问特定的数据库,否则需要在mysql的查询或者操作语句中,指定好表名


        cur = goDB.cursor()
        sql = '''
SELECT  '-' 日期, 
'-' merchant_member_id
;'''


        try:
            #执行SQL语句检查是否连接成功
                cur.execute(sql)
                data = cur.fetchall()
                col_name_list = [tuple[0] for tuple in cur.description]
                dt = pd.DataFrame(data=list(data),columns=col_name_list)
        except:
            print("Error")



        #关闭连接
        goDB.close()
        server.close()
        
    except Exception as err:
        logging.error('日常数据=>%s' % err)
        sendWarningEmail('日常数据=>%s' % err)
        
    finally:
        # 关闭连接
        logging.info('%s, 日常数据操作完成' % getToday())
    return dt


pd.set_option('display.max_colwidth', -1)  # 能显示的最大宽度, 否则to_html出来的地址就不全




def get_html_msg():
    """
    1. 构造html信息
    """
    msg = parseData()
    df_html = msg.to_html(escape=False)

    head = \
        """
        
            
            
        
        """

    # 构造模板的附件(100)
    body = \
        """
        

        

当日数据统计


当日数据——(总计-分员工)

{df_html}

—— 本次报告完 ——

"""
.format(df_html=df_html) html_msg= "" + head + body + "" # 这里是将HTML文件输出,作为测试的时候,查看格式用的,正式脚本中可以注释掉 fout = open('t4.html', 'w', encoding='UTF-8', newline='') fout.write(html_msg) return html_msg def send_data_df(): """发送邮件的脚本""" # 邮件服务信息,个人 # smtp_server = 'smtp.163.com' # username = "[email protected]" # password = 'xxxxxx' # 授权码,并不是邮箱登陆密码 # 邮件服务信息,公司 smtp_server = 'smtp.qq.com' username = "******@qq.com" password = 'mrms*******ifdf' # qq授权码, # 邮件发送和接收人 sender = username receiver = ['******@qq.com','******@qq.com'] # 邮件头信息 msg = MIMEMultipart('related') msg['Subject'] = Header('****数据,%s(**时间)'% getyindutime()) msg["From"] = formataddr(["昵称", sender]) msg['To'] = ','.join(receiver) # 这里要注意 # html 内容 html_msg = get_html_msg() content_html = MIMEText(html_msg, "html", "utf-8") msg.attach(content_html) # 发送邮件,测试成功,流程都是固定的:创建客户端,登陆,发送,关闭 email_client = smtplib.SMTP_SSL(smtp_server,465) email_client.login(username, password) email_client.sendmail(sender, receiver, msg.as_string()) email_client.quit() if __name__ == '__main__': scheduler = BlockingScheduler() scheduler.add_job(send_data_df, 'cron', hour='14,18,20,21',minute='30') ## 定时 print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C ')) try: scheduler.start() except (KeyboardInterrupt, SystemExit): pass

你可能感兴趣的:(python)