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. Linux无写权限打zip

    opt下tiger.txt没权限得时候可以这样直接用zip打包 zip /tmp/1.zip /opt/tiger.txt

  2. MySQL表空间结构

    在Innodb中,我们可以指定一张表的数据是保存在独立表空间还是系统表空间,这个参数是:innodb_file_per_table 如果我们设置这个参数的值为0,那么一个表将使用系统表空间来保存表的数 ...

  3. 随机IP代理插件Scrapy-Proxies

    安装: pip install scrapy_proxies github:   https://github.com/aivarsk/scrapy-proxies scrapy爬虫配置文件setti ...

  4. winform 获得局域网内在线IP和计算机名,获取IP,多线程网络编程

    转载请注明来源:https://www.cnblogs.com/hookjc/ using System; using System.Collections.Generic; using System ...

  5. IDEA中Git的一般使用场景

    感谢大佬:https://www.cnblogs.com/javabg/p/8567790.html 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小 ...

  6. xcode 常用插件 加快开发速度 --严焕培

    1.KSImageNamed-Xcode 为项目中使用的UIImage的imageNamed提供文件名自动补全功能.使用[UIImage imageNamed:@"xxx"]时,该 ...

  7. HDOJ acm steps 3.1.1

    (都是递推求值,呵呵,好开心- - ) 今天又是在自习室通宵(文明玩的停不下来了) 游戏玩完想想该水题了,于是打开了HDOJ的ACM STEPS(这是个好东西,就像他的名字,一步步来的) 2.3.x貌 ...

  8. 【BZOJ2820】YY的GCD(莫比乌斯反演 数论分块)

    题目链接 大意 给定多组\(N\),\(M\),求\(1\le x\le N,1\le y\le M\)并且\(Gcd(x, y)\)为质数的\((x, y)\)有多少对. 思路 我们设\(f(i)\ ...

  9. ios真机弱网测试

    一.开启苹果手机开发者选项 首先你需要将iPhone和一台Mac电脑相连接,然后在Mac上打开Xcode开发工具,此时你iPhone的设置里就会出现"开发者"这个选项了. 二.进入 ...

  10. atc工具模拟网络

    通过Facebook开源的atc工具,进行模拟不同的网络情况,如图: 目前不支持python3 相关网址: ATC http://facebook.github.io/augmented-traffi ...