1、发送邮件脚本

  1. #coding=utf-8
  2. import smtplib
  3. from email.header import Header
  4. from email.mime.text import MIMEText
  5. from email.utils import formataddr
  6. from email.utils import parseaddr, formataddr
  7. from email.mime.multipart import MIMEMultipart
  8.  
  9. mail_list = {
  10. 'sender':'test@qq.com', #发件人
  11. 'receivers':'****@qq.com', #收件人
  12. 'title':'*****', #邮件主题
  13. 'content':'*****', #邮件内容
  14. 'filename':'',#附件内容
  15. 'server':'localhost' #发送邮件服务器。默认为本机
  16. }
  17.  
  18. def _format_addr(s):
  19. name, addr = parseaddr(s)
  20. return formataddr((Header(name, 'utf-8').encode(), addr)) #
  21.  
  22. def sendmail(**kwargs):
  23. #sender,receivers,title,content,filename,server = 'localhost'
  24. '''
  25. :param sender: 发件人 my_sender = 'test1<test1@yonyou.com>,test<test@yonyou.com>'
  26. :param receivers: 收件人
  27. :param title: 邮件标题
  28. :param content: 邮件内容
  29. :param attfilename: 附件名称
  30. :param server: 服务器的名字默认为localhost,本机
  31. :return:
  32. '''
  33. message = MIMEMultipart()
  34. message['From'] = _format_addr(kwargs['sender'])
  35. message['Subject'] = Header(kwargs['title'], 'utf-8')
  36. # message['To'] = _format_addr(kwargs['receivers']) #收件人只显示自己
  37. # print(kwargs['receivers'])
  38. message['To'] = kwargs['receivers']# 可以看得见多个收件人
  39.  
  40. #
  41. message.attach(MIMEText(kwargs['content'], 'plain', 'utf-8'))
  42. att1 = MIMEText(open(kwargs['attfilename'], 'rb').read(), 'base64', 'utf-8')
  43. att1["Content-Type"] = 'application/octet-stream'
  44. att1["Content-Disposition"] = 'attachment; filename=%s'%(kwargs['attfilename'])
  45. message.attach(att1)
  46.  
  47. try:
  48. smtpObj = smtplib.SMTP(kwargs['server'])
  49. smtpObj.sendmail(kwargs['sender'], kwargs['receivers'].split(','), message.as_string())
  50. print(kwargs['receivers'].split(','))
  51. except smtplib.SMTPException:
  52. print("Error: 无法发送邮件")
  53.  
  54. #sendmail(**mail_list)

2、导出excle脚本

  1. # coding:utf8
  2. import sys
  3. import xlwt
  4. import mysql.connector
  5. import datetime
  6. import send_mail
  7. import os
  8. import time
  9.  
  10. nowtime = datetime.datetime.now().strftime('%Y%m%d')
  11. oddir="/app/crontab/python"
  12. filename = "%s/test%s.xls"%(oddir,nowtime)
  13. file_count = 0
  14. end_date=time.strftime("%Y-%m-%d", time.localtime())
  15.  
  16. sql='''select* from test t where t.create_time > '2019-07-01 00:00:00' and t.create_time <%s;
  17. '''
  18.  
  19. config = {
  20. 'user': '*****',
  21. 'password': '*****',
  22. 'host': '********',
  23. 'port': '3306',
  24. 'database': '********',
  25. 'charset': 'utf8'
  26. }
  27.  
  28. mail_list = {
  29. 'sender':'test@PH-LOTH-V159.localdomain', #发件人
  30. 'receivers':'test@yonyou.com', #收件人
  31. 'title':'注册统计', #邮件主题
  32. 'content':'统计数据', #邮件内容
  33. 'attfilename':'',#附件内容
  34. 'server':'localhost' #发送邮件服务器。默认为本机
  35. }
  36.  
  37. def get_conn():
  38. conn = mysql.connector.connect(**config)
  39. return conn
  40.  
  41. def query_all(cur, sql, args):
  42. '''
  43. #参数说明
  44. :param cur:
  45. :param sql: 执行的sql
  46. :param args: sql中的桉树
  47. :return:
  48. '''
  49. print(sql)
  50. print(args)
  51. cur.execute(sql, args)
  52. return cur.fetchall()
  53.  
  54. def export_excle(filename, sql, outputpath):
  55. '''
  56. # 参数说明
  57. :param filename: 文件名称
  58. :param sql: 执行脚本
  59. :param outputpath: 输出路径
  60. :return:
  61. '''
  62. file_count = 0
  63. try:
  64. conn = get_conn()
  65. cur = conn.cursor()
  66.  
  67. # 查询结果
  68. results = query_all(cur=cur, sql=sql, args=[end_date])
  69. # 获取MYSQL里面的数据字段名称
  70. fields = cur.description
  71.  
  72. # 获取excle对象
  73. workbook = xlwt.Workbook()
  74. sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
  75. # not isinstance(test[2][0],str)
  76.  
  77. # 写入表头信息
  78. for line in range(0, len(fields)):
  79. if isinstance(fields[line][0], (bytes, bytearray)):
  80. sheet.write(0, line, u'%s' % (fields[line][0]).decode())
  81. else:
  82. sheet.write(0, line, u'%s' % (fields[line][0]))
  83.  
  84. # 写入数据信息
  85. row = 1 # 第二行开始
  86. col = 0
  87. file_count =len(results)
  88. for row in range(1, len(results)+1):
  89. for col in range(0, len(fields)):
  90. if isinstance(results[row - 1][col], (bytes, bytearray)):
  91. sheet.write(row, col, u'%s' % results[row - 1][col].decode())
  92. else:
  93. sheet.write(row, col, u'%s' % results[row - 1][col])
  94. #workbook.save("%s/%s.xls"%(oddir,filename) ) #filename
  95. workbook.save(filename)
  96.  
  97. finally:
  98. if conn:
  99. conn.close()
  100. return file_count
  101.  
  102. # 结果测试
  103. if __name__ == "__main__":
  104. # sql = input("请输入要查询的sql:")
  105. #filename = input("请输入excle的名字")
  106. file_count = export_excle(filename, sql, oddir) #执行导出结果
  107. if os.path.exists(filename):
  108. if file_count >=1:
  109. print("邮件已经发送 %s"%(mail_list['attfilename']))
  110. mail_list['attfilename'] = filename
  111. print("邮件已经发送 %s"%(mail_list['attfilename']))
  112. send_mail.sendmail(**mail_list)
  113. else :
  114. print("文件大小为空,请检查")
  115. else :
  116. print("文件不存在,请联系管理员检查脚本是否有异常")

python实用脚本-定时导出数据库中的数据并且发送数据到邮箱的更多相关文章

  1. Python 实用脚本

    Python 实用脚本 脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而 ...

  2. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  4. jsp+servlet+poi导出数据库中的数据

    index.jsp: <a href="POIout">简单导出数据</a> <a href="POIoutTemplate"&g ...

  5. 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录

     孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...

  6. sql脚本来获取数据库中的所有表结构了

    sql脚本来获取数据库中的所有表结构了,代码如下: use AdventureWorks2008 go SELECT (case when a.colorder=1 then d.name else ...

  7. 随机获取数据库中的某一条数据(基于yii2框架开发)

    注意: 使用PHP函数array_rand()得到的是这个数组中的那个值相对应的下标键值,需要配合原来的数组进行,例如: $rand_keys = array_rand($ids,1); $id = ...

  8. 在数据库中(Oracle),根据时间查询数据: to_date()和to_char()函数

    1. to_date() 函数 1.1 格式 to_date("要转换的字符串","转换的格式")   //两个参数的格式必须匹配,否则会报错.即按照第二个参数 ...

  9. laravel如何从mysql数据库中随机抽取n条数据

    laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...

随机推荐

  1. 阿里巴巴基于应用和变更的交付模式|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  2. python使用range()函数创建数字列表list

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 numbers=list(range(1,6)) print(numbers) range指定步长: #!/usr ...

  3. Android开发-资源导入

    安卓开发首先要导入开发资源,这些资源包括图片,图标等,方便开发过程中的使用 我是跟着b站博主做的记账本app所以导入的资源也来自于网络 将资源导入到res文件夹下这里面包括颜色资源,布局资源,图片资源 ...

  4. 学习JAVAWEB第二天

    DML:C:添加数据INSERT INTO 表名(列名1,2...) Values(值1,2,3..)查询表select * from表名D:删除数据delete from 表名 where 条件(i ...

  5. 好用的 NPL 词库分类。

    ## 好用的 NPL 词库分类. 专业的词库分类技术. 主要服务于金融领域的词库划分. 上图!对比一下我们的分词和jie等模型的效果.做的就是专业! ![在这里插入图片描述](https://img- ...

  6. deque概述

    1.简介 双端队列deque,与vector的最大差异在于: 一.deque运行常数时间对头端或尾端进行元素的插入和删除操作. 二.deque没有所谓的容器概念,因为它是动态地以分段连续空间组合而成随 ...

  7. 在view中实现UIViewController的跳转 By H.L

    view中是不能进行UIViewController的push,pop等操作的,若进行跳转操作,一般是用代理,block,通知等实现,那如何实现在ViewController的subView中实现跳转 ...

  8. SpringAOP/切面编程示例

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833954.html Spring AOP/切面编程实例和一些注意事项, 主要是利用注解来实 ...

  9. 为hade增加model自动生成功能

    大家好,我是轩脉刃. 我们写业务的时候和db接触是少不了的,那么要生成model也是少不了的,如何自动生成model,想着要给hade框架增加个这样的命令. 看了下网上的几个开源项目,最终聚焦在两个项 ...

  10. 框架3.1--V·P·N简介

    目录 框架3.1-VPN简介 1.晨考 2.昨日问题 3.今日内容 4.vpn的简介 5.VPN的作用 6.VPN的种类 7.介绍OpenVPN 框架3.1-VPN简介 1.晨考 1.画iptable ...