用python将mysql这个表里的employee_name(员工)和email_address(邮箱地址)两个字段作为excel文件名,然后将start_reminder_time(开始提醒时间)作为第一次发送邮件时间。mysql中每一条记录都有一个独立的文件名和发送时间
目前的代码如下:一共两部分,上半部分是访问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