Python2+openpyxl从Mysql数据库并发送带附件的邮件

215 阅读3分钟

场景说明:公司运营小姐姐经常让我给她拉数据,为了避免重复工作,就搞了这个脚本。所以就有了这篇文章。

升级版本,解决xlwt组件单sheet最大行数限制,改用openpyxl组件。

1、环境说明

1.1、开发环境

环境版本备注
系统Windows 11
Python2.7.5
IDEPycharm 2022

1.2、运营环境

环境版本备注
系统Linux Centos 7.5
Python2.7.5

1.3、Python安装与配置

省略。请自行百度。

1.4、组件安装

首先用PyCharm随便创建一个项目,然后将创建一个python文件,然后将下面内容复制进去即可。

#!/usr/bin/env python
# coding=utf-8
​
import datetime
import os
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
​
import MySQLdb
import openpyxl
​
​
def createSheet(workbook, sheetname, fields, results):
    sheet = workbook.create_sheet(sheetname)
    fieldList = []
    for ifs in range(0, len(fields)):
        fieldList.append(fields[ifs][0])
    sheet.append(fieldList)
    for row in results:
        sheet.append(row)
​
​
def getDataFromDB(sql, cursor):
    cursor.execute(sql)
    results = cursor.fetchall()
    fields = cursor.description
​
    return fields, results
​
​
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))
​
​
def sendEmail(fileName, fileNameWithoutPath, timeflag):
    # 输入Email地址和口令:
    from_addr = 'zhgl.info@aliyun.com'
    password = 'zhgl123456'
    # 输入SMTP服务器地址:
    smtp_server = 'smtp.aliyun.com'
    smtp_port = 465
    # 输入收件人地址:
    to_addr_list = ['anyofus4135@qq.com']
​
    content = "积分兑换数明细报表"
​
    # 生成邮件体
    msg = MIMEMultipart('utf-8')
    msg['From'] = _format_addr(from_addr)
    to_addr = []
    for addr in to_addr_list:
        to_addr.append(_format_addr(addr))
    msg['To'] = ','.join(to_addr)
    msg['Subject'] = Header(u'用户积分兑换明细' + timeflag, 'utf-8').encode()
​
    body = MIMEText(content,'html','utf-8')
    msg.attach(body)
​
    att = MIMEText(open(fileName, 'rb').read(), 'base64', 'utf-8')
    att["Content-Type"] = 'application/octet-stream'
    att["Content-Disposition"] = 'attachment;filename="%s"' % Header(fileNameWithoutPath, 'utf-8').encode()
    msg.attach(att)
​
    # 连接邮件服务器发送邮件
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    # server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addr, msg.as_string())
    server.quit()
​
​
def main():
    lastDate = datetime.date.today() - datetime.timedelta(days=1)
​
    timeflagToday = datetime.date.today().strftime('%Y-%m-%d')
    # 日志格式 yyyy-MM-dd
    timeflag = lastDate.strftime('%Y-%m-%d')
    timeflag_02 = lastDate.strftime('%Y%m%d')
​
    conn = MySQLdb.connect(host='192.168.1.88', user='root', passwd='123456`', db='jack', port=3306,
                           charset='utf8')
    cursor = conn.cursor()
​
    sql_charge = "SELECT pro_name 产品名称,CONVERT (AES_DECRYPT(UNHEX(user_mobile),'zhgl-iflytek') USING utf8) 用户手机号,receiver_name 收货人, receiver_address 收货地址,remark 备注,date_format(create_time, '%Y-%m-%d %H:%i:%S') 创建时间 FROM mall_order,mall_product WHERE mall_order.pro_id = mall_product.id"
​
    workbook = createExcel()
​
    fields, results = getDataFromDB(sql_charge, cursor)
    createSheet(workbook, u"积分兑换明细", fields, results)
​
    cursor.close()
    conn.close()
​
    fileNameWithoutPath = "积分兑换明细%s.xls" % (timeflagToday)
​
    fileName = "d:/data/script/%s" % (fileNameWithoutPath)
​
    workbook.save(fileName)
​
    sendEmail(fileName, fileNameWithoutPath, timeflagToday)
​
    os.remove(fileName)
​
​
main()

1.4.1、开发环境组件安装

前提首先尝试用Pycharm安装对应的组件,会自动下载相关安装工具包pip。然后再结合下面手动进行安装。

  • 安装MySQLdb组件

MySQLdb组件是用来操作数据库的,我们使用PyCharm创建项目时创建了虚拟环境,将下载好的MySQL-Python文件复制到项目目录虚拟环境>venv>Scripts下面,地址www.lfd.uci.edu/~gohlke/pyt…,找到对应版本的whl文件,如下图

image-20220714104244710

执行命令进行安装

pip install MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
  • 安装openpyxl组件

openpyxl.readthedocs.io/en/stable/

执行命令安装openpyxl

pip install openpyxl

以上安装完成后,项目就不报错了,然后请自行替换里面的邮箱、数据库、sql等配置。

1.4.2、实际运行环境组件安装

我们运行的服务器python版本也是2.7.5,同样需要安装MySQLdb、openpyxl。首先pip工具没有,我们要先安装pip。

yum install python-pip

安装MySQLdb组件

yum install MySQL-python

安装openpyxl组件

pip install openpyxl

2、部署及验证

2.1、部署

直接将调整好的脚本文件上传到服务器对应的目录下我这里放到了【/data/script】下面,然后增加执行权限

chmod +x score_charge_reord.py

image-20220714112904190

2.2、验证

手动执行脚本

python score_charge_reord.py

查看邮件发送情况,是否收到邮件。

2.3、创建系统定时任务

在crond任务调度中增加我们的任务,每天早上9点执行发送脚本。编辑任务调度

crontab -e

将下面的内容粘贴到文件系统调度配置中

#每天早上九点发送用户积分兑换明细
0 9 * * *  python /data/script/score_charge_reord.py >> /data/script/score_charge_reord.log

重载系统调度服务

service crond reload

搞完后,以后让运营小姐姐每天9点自己查邮件即可,不会再来找我了。是不是挺爽的。