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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。