python3+mysql查询数据并通过邮件群发excel附件
本文实例为大家分享了python3邮件群发excel附件的具体代码,供大家参考,具体内容如下
连接、查询mysql,导入到excel文件,定时群发邮件与附件。
主要用到pymysql,smtplib,xlwt
#1、导入模块
importpymysql#Python3的mysql模块,Python2是mysqldb importos importdatetime#定时发送,以及日期 importshutil#文件操作 importsmtplib#邮件模块 fromemail.mime.textimportMIMEText fromemail.mime.multipartimportMIMEMultipart fromemail.headerimportHeader importtime importxlwt#excel写入
#2、连接并查询mysql
defeMysql(mysql_host,mysql_port,mysql_user,mysql_password,mysql_db,sql):
try:
db=pymysql.connect(host=mysql_host,port=mysql_port,user=mysql_user,password=mysql_password,db=mysql_db,charset='utf8')#连接数据库编码注意是utf8,不然中文结果输出会乱码
print("MYSQLCONNECTED.")#连接数据库
cursor=db.cursor()#使用cursor()方法获取操作游标
cursor.execute(sql)#执行SQL语句
print('SQLEXECUTED')
results=cursor.fetchall()#结果
returnresults
print('RESULTSEXECUTED')
db.close()#关闭数据库连接
print('MYSQLCLOSED')
except:
print('SQLFAILED')
#3、写入excel
defeWrite(fLocate,results,file_sheet,file_subject,style0):
try:
ifos.path.exists(fLocate):
os.remove(fLocate)#如果文件存在,则删除
f=xlwt.Workbook(encoding='utf-8')#打开excel文件
fs=f.add_sheet(file_sheet)#sheet名
subject=list(file_subject)#列表化
foriinrange(len(subject)):#找到日期列
if'日期'insubject[i]:
col_num=i
foriinrange(len(subject)):#sheet标题
fs.write(0,i,subject[i])
foriinrange(len(results)):#sheet数据,日期列格式为date
forjinrange(len(results[0])):
ifj==col_num:
fs.write(i+1,j,results[i][j],style0)
else:
fs.write(i+1,j,results[i][j])
foriinrange(10):#单元格宽度为
fs.col(i).width=3333
print("WRITEFINISHED")
f.save(fLocate)
except:
print("WRITEFAILED")
#4、发送邮件
defeSend(sender,receiver,username,password,smtpserver,subject,e_content,file_path,file_name):
try:
#邮件头
message=MIMEMultipart()
message['From']=sender#发送
message['To']=",".join(receiver)#收件
message['Subject']=Header(subject,'utf-8')
message.attach(MIMEText(e_content,'plain','utf-8'))#邮件正文
#构造附件
att1=MIMEText(open(file_path+file_name,'rb').read(),'base64','utf-8')
att1["Content-Type"]='application/octet-stream'
att1["Content-Disposition"]="attachment;filename="+file_name
message.attach(att1)
#执行
smtp=smtplib.SMTP()
smtp.connect(smtpserver)#连接服务器
smtp.login(username,password)#登录
smtp.sendmail(sender,receiver,message.as_string())#发送
smtp.quit()
print("SEND")
except:
print("SENDFAILED")
#5、配置与执行
whileTrue:
#配置
#__time_____
ehour=5#定时小时
emin=21#定时分钟
esec=41#定时秒
current_time=time.localtime(time.time())#当前时间date
cur_time=time.strftime('%H%M',time.localtime(time.time()))#当前时间str
#__mysql_____
mysql_host=mysql_host#登录host
mysql_port=mysql_port#登录port
mysql_user=mysql_user#登录名
mysql_password=mysql_password#登录密码
mysql_db=mysql_db#数据库
sql=sql.encode('utf-8')#sql查询语句编码
#__email_____
sender=sender#发件人邮箱
receiver=['453032441@qq.com']#收件人邮箱,可以多个(列表形式)群发
#
username=username#发件人姓名
password=password#smtp密码,qq是给你分配一串,163是自己设置
smtpserver=smtpserver#邮箱服务器
subject="Hey,here'ssomethinginteresting"#邮件标题
e_content='{0:^27}\n{1:^27}\n{2:^25}\n{3:^25}'.format('i','/\\','(-----)','(--------)')#邮件正文#邮件正文
#__file_____
file_path="D:/"#文件位置
file_name="shit.xls"#文件名
fLocate=file_path+file_name#文件路径
file_subject='Gave','you','a','piece','of','shit.'#sheet标题
file_sheet='ok'#sheet名
style0=xlwt.XFStyle()
style0.num_format_str='YYYY-MM-DD'
#操作
if((current_time.tm_hour==ehour)and(current_time.tm_min==emin)and(current_time.tm_sec==esec)):
print("START")
results=eMysql(mysql_host,mysql_port,mysql_user,mysql_password,mysql_db,sql)
eWrite(fLocate,results,file_sheet,file_subject,style0)
eSend(sender,receiver,username,password,smtpserver,subject,e_content,file_path,file_name)
print(cur_time)
time.sleep(1)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。