m0_62581665 2022-01-02 11:57 采纳率: 46.2%
浏览 58
已结题

使用python将mysql字段赋值成变量后生成excel文件,以附件形式将excel发送邮件

用python将mysql这个表里的employee_name(员工)和email_address(邮箱地址)两个字段作为excel文件名,然后将start_reminder_time(开始提醒时间)作为第一次发送邮件时间。mysql中每一条记录都有一个独立的文件名和发送时间

img

目前的代码如下:一共两部分,上半部分是访问mysql整张表后在指定文件夹生成excel,后半部分是到了时间自动发送邮件:

import pymysql
import xlwt
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import datetime

def sql(sql):  # 定义一个执行SQL的函数
    conn = pymysql.connect(host='192.168.00.00', port=3306, user='root', passwd='123456', db='mysql',
                           charset='utf8')  # 打开数据库连接
    cursor = conn.cursor()  # 执行数据库的操作是由cursor完成的,使用cursor()方法获取操作游标
    cursor.execute(sql)  # 执行sql语句
    results = cursor.fetchall()  # 获取查询的所有记录
    cursor.close()  # 关闭游标
    conn.close()  # 关闭数据库连接
    return results


def wite_to_excel(name, self=None):
    filename = name + '.xls'  # 定义Excel名字
    wbk = xlwt.Workbook()  # 实例化一个Excel
    sheet1 = wbk.add_sheet('ort', cell_overwrite_ok=True)  # 添加该Excel的第一个sheet,如有需要可依次添加sheet2等
    fileds = ['提醒事项ID', '厂区', '部门', '提醒事项描述','员工工号','员工姓名', '开始提醒时间', '频次', '下次提醒', '提前提醒天数', '邮箱地址']  # 直接定义结果集的各字段名

    results = sql(
        "select reminder_id,factory_area,department,reminder_description,badge,employee_name,convert(start_reminder_time,char(20)),frequency,convert(next_reminder_time,char(20)),advance_reminder_date,email_address from reminder_work_item_t ")  # 调用函数执行SQL,获取结果集

    for i in range(0, len(fileds)):  # EXCEL新表的第一行  写入字段信息
        sheet1.write(0, i, fileds[i])

    # 执行数据插入
    for row in range(1, len(results) + 1):  # 第0行是字段名,从第一行开始插入数据
        for col in range(0, len(fileds)):  # 依据字段个数进行列的插入
            sheet1.write(row, col, results[row - 1][col])  # 第row行,第col列,插入数据(第1行,第i列,插入results[0][i])

    # 执行保存
    wbk.save(filename)
wite_to_excel('reminder_work_item')


#向指定一个或多个邮箱发送邮件
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = 'zhangsan'
password = '123456' # 密码或邮箱授权码
to_addr = 'qq.com'
smtp_server = 'qq.com'

def send_mail():
    server = smtplib.SMTP(smtp_server, 25)
#    server.set_debuglevel(1)
    server.ehlo()  # 向邮箱发送SMTP 'ehlo' 命令
    server.starttls()
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()


i = 1
limit = 3
scheduled_time = datetime.datetime(2021, 12, 30, 14, 8,50)
print('首次发送邮件的时间是:', scheduled_time)
while True:
    now = datetime.datetime.now().replace(microsecond=0)
    if now == scheduled_time:
        msg = MIMEText(open(r'H:\附件\reminder_work_item.xls', 'rb').read(),'base64','utf-8')
        msg["Content-Type"] = 'application/octet-stream'
        msg["Content-Disposition"] = 'attachment; filename="reminder_work_item.xls"'
        msg['From'] = _format_addr('张三')<%s>' % from_addr)  #邮件封面
        msg['To'] = _format_addr('张三') <%s>' % to_addr)      #收件人昵称
        msg['Subject'] = Header('TEST%s...' % i, 'utf-8').encode()
        send_mail()
        scheduled_time = scheduled_time + datetime.timedelta(seconds = 10)
        print('第%s次邮件发送成功!现在时间是' % i, datetime.datetime.now().replace(microsecond=0))
        i = i + 1
        if i < limit:
            print('下一次发送邮件的时间是:', scheduled_time.replace(microsecond=0))
    else: pass
    if i >= limit:
        print('所有邮件发送完毕,现在的时间是:', datetime.datetime.now().replace(microsecond=0))
        break



```@Silenceyezi @weixin_34129145 @Jancydc @闷油瓶小锅

  • 写回答

1条回答 默认 最新

  • chuifengde 2022-01-02 12:42
    关注

    写的非常好

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月15日
  • 创建了问题 1月2日

悬赏问题

  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开