1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas
import pandas as pd
import MySQLdb
import MySQLdb.cursors
import os
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
#返回SQL结果的函数
def retsql(sql):
db_user = MySQLdb.connect('IP','用户名','密码','j数据库名(可以不指定)',cursorclass=MySQLdb.cursors.DictCursor(设置返回结果以字典的格式))
cursor = db_user.cursor()
cursor.execute("SET NAMES utf8;"(设置字符集为utf-8,不然在返回的结果中会显示乱码,即使数据库的编码设置就是utf-8))
cursor.execute(sql)
ret = cursor.fetchall()
db_user.close()
return ret
#生成xls文件的函数
def retxls(ret,dt):
file_name = datetime.datetime.now().strftime("/path/to/store/%Y-%m-%d-%H:%M") + dt + ".sql.xlsx"
dret = pd.DataFrame.from_records(ret)
dret.to_excel(filename,"Sheet1",engine="openpyxl")###z注意openpyxl这个库可能在生成xls的时候出错,pip install openpyxls==1.8.6,其他版本似乎与pandas有点冲突,安装1.8.6的即可
print "Ok!!! the file in",file_name
return filename
#发送邮件的函数
##传入主题,显示名,目标邮箱,附件名
def sendm(sub,cttstr,to_list,file):
msg = MIMEMultipart()
att = MIMEText(open(file,'rb').read(),"base64","utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename="sql查询结果.xlsx"'
msg['from'] = '发件人地址'
msg['subject'] = sub
ctt = MIMEText(cttstr,'plain','utf-8')
msg.attach(att)
msg.attach(ctt)
try:
server = smtplib.SMTP()
#server.set_debuglevel(1) ###如果问题可打开此选项以便调试
server.connect("mail.example.com",'25')
server.starttls() ###如果开启了ssl或者tls加密,开启加密
server.login("可用邮箱用户名","密码")
server.sendmail(msg['from'],to_list,msg.as_string())
server.quit()
print 'ok!!!'
except Exception,e:
print str(e)
###想要查询的sql语句
sql="""sql语句"""
#接收邮件的用户列表
to_list = ['test1@example.com',
'test2@example.com']
#执行sql并将结果传递给ret
ret = retsql(sql)
#将结果文件路径结果传给retfile
retfile = retxls(ret,"1")
#发送邮件
#发送sql语句内容
sendm(sub1,sub1,to_list,retfile1)
|