分享下之前做的一些练手项目代码,供大家参考。
实现功能很简单,通过linux或windows平台的计划任务功能实现代码的自动触发,从而可实现任务定时执行。
任务是可以讲多个检索结果导成Excel自动编辑好邮件发送。
功能如下:
1、一个传入sql导出数据的函数,用来获取检索出来的结果
def get_datas(config,sql):
# 一个传入sql导出数据的函数
# 跟数据库建立连接
conn = cx_Oracle.connect(config, nencoding='utf-8')
# 使用 cursor() 方法创建一个游标对象 cursor
cur = conn.cursor()
# 使用 execute() 方法执行 SQL
cur.execute(sql)
# 获取所需要的数据
datas = cur.fetchall()
#关闭连接
cur.close()
#返回所需的数据
return datas
2、一个用来获取导出检索的字段函数
def get_fields(config,sql):
# 一个传入sql导出字段的函数
#conn = cx_Oracle.connect("d4moddev/d4moddevap@172.18.7.31:1521/d3mesdb", nencoding='utf8')
conn = cx_Oracle.connect(config, nencoding='utf8')
cur = conn.cursor()
cur.execute(sql)
# 获取所需要的字段名称
fields = cur.description
cur.close()
return fields
3、生成Excel,将之前获取的字段或者Value导入Excel中
def get_excel(data, field, file):
# 将数据和字段名写入excel的函数
#新建一个工作薄对象
new = xlwt.Workbook(encoding='utf8')
#激活一个新的sheet
sheet = new.add_sheet("QueryResult")
#将字段名称循环写入excel第一行,因为字段格式列表里包含列表,每个列表的第一元素才是字段名称
for col in range(len(field)):
#row代表行数,column代表列数,value代表单元格输入的值,行数和列数都是从1开始,这点于python不同要注意
_ = sheet.write(1, col+1, field[col][0])
#将数据循环写入excel的每个单元格中
for row in range(len(data)):
for col in range(len(field)):
#因为第一行写了字段名称,所以要从第二行开始写入
_ = sheet.write(row+2, col + 1, data[row][col])
#将生成的excel保存,这步是必不可少的
newworkbook = new.save(file)
#返回生成的excel
return newworkbook
4、生成邮件,将输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件。
注意多个文件需要放在同一文件路径引用。
def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name):
# 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
#生成一个空的带附件的邮件实例
message = MIMEMultipart()
#将正文以text的形式插入邮件中
message.attach(MIMEText(email_text, 'plain', 'utf-8'))
#生成发件人名称(这个跟发送的邮件没有关系)
message['From'] = Header(email_from, 'utf-8')
#生成收件人名称(这个跟接收的邮件也没有关系)
message['To'] = Header(email_to, 'utf-8')
#生成邮件主题
message['Subject'] = Header(email_Subject, 'utf-8')
#读取附件的内容
for file in annex_name:
if(os.path.isfile(annex_path+'/'+file)):
#循环构造附件a
att1 = MIMEText(open(annex_path+'/'+file, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 生成附件的名称
att1["Content-Disposition"] = 'attachment; filename=' + file
# 将附件内容插入邮件中
message.attach(att1)
#返回邮件
return message
5、发送邮件方法。
def send_email(sender, password, receiver, msg):
# 一个输入邮箱、密码、收件人、邮件内容发送邮件的函数
try:
#找到你的发送邮箱的服务器地址,已加密的形式发送
server = smtplib.SMTP("whmail.csot.tcl.com") # 发件人邮箱中的SMTP服务器
# server.ehlo()
# #登录你的账号
# server.login(sender, password) # 括号中对应的是发件人邮箱账号、邮箱密码
#发送邮件
server.sendmail(sender, receiver, msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号(是一个列表)、邮件内容
print("邮件发送成功")
server.quit() # 关闭连接
except Exception:
print("邮件发送失败")
6、主函数
if __name__ == "__main__":
reload(sys)
sys.setdefaultencoding("utf-8")
print(datetime.datetime.now())
# 得到昨天的日期
todaystr = gettoday('A')
yesterdaystr = getYesterday('A')
beforeYesterdaystr = getTheDayBeforeYesterday('A')
my_sql="""
SELECT *
FROM CT_AGVTRANSFERCOMMANDHISTORY C
WHERE C.EVENTTIME BETWEEN
TO_DATE('{}', 'yyyy-mm-dd hh24:mi:ss') AND
TO_DATE('{}', 'yyyy-mm-dd hh24:mi:ss')
ORDER BY C.TRANSPORTJOBNAME DESC
"""
my_sql = my_sql.format(yesterdaystr+' 07:30:00', todaystr+' 07:30:00')
# 生成数据
my_data = get_datas(t4modproddb, my_sql)
print(my_sql)
# 生成字段名称
my_field = get_fields(t4modproddb, my_sql)
# 文件名称
my_file_name = 'AgvInfo' + todaystr + '.xls'
# 文件路径
file_path = 'E:/TEST/' + my_file_name
# 生成excel
get_excel(my_data, my_field, file_path)
###############c重复执行sql############
my_sql1 = """xxx
"""
my_sql1 = my_sql1.format(getYesterday('B')+'073000', gettoday('B')+'073000')
# 生成数据
my_data1 = get_datas(t4logproddb, my_sql1)
print(my_sql1)
# 生成字段名称
my_field1 = get_fields(t4logproddb, my_sql1)
# 文件名称
my_file_name1 = 'LogInfo' + todaystr + '.xls'
# 文件路径
file_path1 = 'E:/TEST/' + my_file_name1
# 生成excel
get_excel(my_data1, my_field1, file_path1)
################c重复执行sqlEND############
my_email_from = 'MES自动数据查询'
my_email_to = 'FA'
# 邮件标题
my_email_Subject = 'TransferCommandReport' + todaystr
# 邮件正文
my_email_text = "comment"
# 附件地址
my_annex_path = 'E:/TEST/'
# 附件名称
my_annex_name = [my_file_name , my_file_name1]
# 生成邮件
my_msg = create_email(my_email_from, my_email_to, my_email_Subject,
my_email_text, my_annex_path, my_annex_name)
my_sender = 'xxx'
my_password = xxx
my_receiver = ['xxx']
# 发送邮件
send_email(my_sender, my_password, my_receiver, my_msg)
print(datetime.datetime.now())
以上有一些信息做过删减。具体的使用格式可以自己多尝试。