python3+mysql查询数据并通过邮件群发excel附件


Posted in Python onFebruary 24, 2018

本文实例为大家分享了python3邮件群发excel附件的具体代码,供大家参考,具体内容如下

连接、查询mysql,导入到excel文件,定时群发邮件与附件。
主要用到pymysql ,smtplib , xlwt

#1、导入模块

import pymysql #Python3的mysql模块,Python2 是mysqldb
import os
import datetime #定时发送,以及日期
import shutil #文件操作
import smtplib #邮件模块
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import time
import xlwt #excel写入

#2、连接并查询mysql

def eMysql(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("MYSQL CONNECTED.")# 连接数据库
  cursor = db.cursor()# 使用cursor()方法获取操作游标
  cursor.execute(sql)# 执行SQL语句
  print('SQL EXECUTED')
  results = cursor.fetchall()# 结果
  return results
  print('RESULTS EXECUTED')
  db.close() # 关闭数据库连接
  print('MYSQL CLOSED')
 except:
  print('SQL FAILED')

#3、写入excel

def eWrite(fLocate,results,file_sheet,file_subject,style0):
 try:
  if os.path.exists(fLocate):
   os.remove(fLocate) # 如果文件存在,则删除
  f = xlwt.Workbook(encoding='utf-8') #打开excel文件
  fs = f.add_sheet(file_sheet) #sheet名
  subject = list(file_subject) #列表化
  for i in range(len(subject)): #找到日期列
   if '日期' in subject[i]:
    col_num=i
  for i in range(len(subject)): #sheet标题
   fs.write(0, i, subject[i])

  for i in range(len(results)): #sheet数据,日期列格式为date
   for j in range(len(results[0])):
    if j== col_num:
     fs.write(i + 1, j, results[i][j],style0)
    else:
     fs.write(i + 1, j, results[i][j])


  for i in range(10): #单元格宽度为
   fs.col(i).width=3333

  print("WRITE FINISHED")
  f.save(fLocate)
 except :
  print ("WRITE FAILED")

#4、发送邮件

def eSend(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("SEND FAILED")

#5、配置与执行

while True:
#配置
 #__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's something interesting"  #邮件标题
 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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学python系列之数据处理编程实例(二)
May 22 Python
简单介绍Python中用于求最小值的min()方法
May 15 Python
Python解惑之True和False详解
Apr 24 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
Python使用字典的嵌套功能详解
Feb 27 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
python写程序统计词频的方法
Jul 29 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
python多进程使用函数封装实例
May 02 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
Python3实现带附件的定时发送邮件功能
Dec 22 #Python
python正则实现提取电话功能
Feb 24 #Python
python3实现公众号每日定时发送日报和图片
Feb 24 #Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 #Python
使用python和pygame绘制繁花曲线的方法
Feb 24 #Python
python3操作微信itchat实现发送图片
Feb 24 #Python
python自动12306抢票软件实现代码
Feb 24 #Python
You might like
PHP脚本的10个技巧(8)
2006/10/09 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
详解python中的hashlib模块的使用
2019/04/22 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
高一历史教学反思
2014/01/13 职场文书
档案接收函
2014/01/13 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
房屋产权证明书
2014/10/15 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
2022年显卡天梯图(6月更新)
2022/06/17 数码科技