我们在工作中有没有遇到过总是有些定时发送邮件的任务,前段时间刚好在网上看到类似的分散案例,今天有时间就拼凑了下,拼凑出了一个完整的自动化每天定时从数据库取数保存成数据文件,作为附件发送邮件。
#导入库——从数据库取数到保存成csv阶段
import mysql.connector
import xlwt
from datetime import datetime
#自定义函数——数据库取数
def get_data(sql):
# 创建数据库连接,user账号,password为账号密码,database为数据库名
conn = mysql.connector.connect(user='****', password='*******', database='*****')
# 创建游标
cur = conn.cursor()
# 执行查询
cur.execute(sql)
# 由于查询语句仅会返回受影响的记录条数并不会返回数据库中实际的值,所以此处需要fetchall()来获取所有内容
result = cur.fetchall()
#关闭游标
cur.close()
#关闭数据库连接
conn.close
# 返给结果给函数调用者
return result
#自定义函数——把读取的数据库数据保存成一个csv文件
def write_data_to_excel(name,sql):
# 将sql作为参数传递调用get_data并将结果赋值给result,(result为一个嵌套元组)
result = get_data(sql)
# 实例化一个Workbook()对象(即excel文件)
wbk = xlwt.Workbook()
# 新建一个名为Sheet1的excel sheet。此处的cell_overwrite_ok =True是为了能对同一个单元格重复操作。
sheet = wbk.add_sheet('Sheet1',cell_overwrite_ok=True)
# 获取当前日期,得到一个datetime对象如:(2016, 8, 9, 23, 12, 23, 424000)
today = datetime.today()
# 将获取到的datetime对象仅取日期如:2016-8-9
today_date = datetime.date(today)
# 遍历result中的每个元素。
for i in range(len(result)):
#对result的每个子元素作遍历,
for j in range(len(result[i])):
#将每一行的每个元素按行号i,列号j,写入到excel中。
sheet.write(i,j,result[i][j])
# 以传递的name+当前日期作为excel名称保存。
wbk.save(name+str(today_date)+'.csv')
#调用前面的两个自定义函数
get_data("select * from customer limit 10")
write_data_to_excel("customer","select * from customer limit 10")
#导入库——调用QQ邮箱接口阶段
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
today = datetime.today()
today_date = datetime.date(today)
sender = '*******@qq.com'#发送邮件的邮箱
receivers = ['*******@qq.com'] # 接收邮件的邮箱
password = '***********'#qq邮箱的授权码
smtp_server = 'smtp.qq.com'#如果是163邮箱的话改成http://smtp.163.com,网上可以查这个
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("任萍", 'utf-8')
message['To'] = Header("***", 'utf-8')
subject = 'custome'
message['Subject'] = Header(subject, 'utf-8')
#邮件正文内容
message.attach(MIMEText('请查收!!!', 'plain', 'utf-8'))
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open("customer"+str(today_date)+'.csv' , 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="customer.csv"'
message.attach(att1)
# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('customer2019-01-03.csv', 'rb').read(), 'base64', ‘utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="customer2019-01-03.csv"'
message.attach(att2)
try:
server = smtplib.SMTP(smtp_server, 25)#SMTP协议的默认TCP端口号是25
server.set_debuglevel(1)
server.login(sender, password)
server.sendmail(sender, receivers, message.as_string())
server.quit()
print ("邮件发送成功")
except smtplib.SMTPException:
print ("Error: 无法发送邮件")
补充:如何设置邮箱使得发件人邮箱开启SMTP协议,并获取授权码,也就是上述代码中的password。
设置——账户——开启服务:POP3/SMTP服务——发送短信获取到授权码
补充:如何在windows下设置定时任务,是的python程序可以每天定时被执行。
这里解释一下三个文本框内容的含义:
【程序或脚本】文本框中填的是Python编译器的名称,一般就是python.exe;
【添加参数】文本框中填的是你的Python程序的完整路径;
【起始于】文本框中填的是Python编译器的目录。
【微信公众号】:Pepper数据分析