1、发送邮件脚本

#coding=utf-8
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.utils import formataddr
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart mail_list = {
'sender':'test@qq.com', #发件人
'receivers':'****@qq.com', #收件人
'title':'*****', #邮件主题
'content':'*****', #邮件内容
'filename':'',#附件内容
'server':'localhost' #发送邮件服务器。默认为本机
} def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr)) # def sendmail(**kwargs):
#sender,receivers,title,content,filename,server = 'localhost'
'''
:param sender: 发件人 my_sender = 'test1<test1@yonyou.com>,test<test@yonyou.com>'
:param receivers: 收件人
:param title: 邮件标题
:param content: 邮件内容
:param attfilename: 附件名称
:param server: 服务器的名字默认为localhost,本机
:return:
'''
message = MIMEMultipart()
message['From'] = _format_addr(kwargs['sender'])
message['Subject'] = Header(kwargs['title'], 'utf-8')
# message['To'] = _format_addr(kwargs['receivers']) #收件人只显示自己
# print(kwargs['receivers'])
message['To'] = kwargs['receivers']# 可以看得见多个收件人 #
message.attach(MIMEText(kwargs['content'], 'plain', 'utf-8'))
att1 = MIMEText(open(kwargs['attfilename'], 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename=%s'%(kwargs['attfilename'])
message.attach(att1) try:
smtpObj = smtplib.SMTP(kwargs['server'])
smtpObj.sendmail(kwargs['sender'], kwargs['receivers'].split(','), message.as_string())
print(kwargs['receivers'].split(','))
except smtplib.SMTPException:
print("Error: 无法发送邮件") #sendmail(**mail_list)

2、导出excle脚本

# coding:utf8
import sys
import xlwt
import mysql.connector
import datetime
import send_mail
import os
import time nowtime = datetime.datetime.now().strftime('%Y%m%d')
oddir="/app/crontab/python"
filename = "%s/test%s.xls"%(oddir,nowtime)
file_count = 0
end_date=time.strftime("%Y-%m-%d", time.localtime()) sql='''select* from test t where t.create_time > '2019-07-01 00:00:00' and t.create_time <%s;
''' config = {
'user': '*****',
'password': '*****',
'host': '********',
'port': '3306',
'database': '********',
'charset': 'utf8'
} mail_list = {
'sender':'test@PH-LOTH-V159.localdomain', #发件人
'receivers':'test@yonyou.com', #收件人
'title':'注册统计', #邮件主题
'content':'统计数据', #邮件内容
'attfilename':'',#附件内容
'server':'localhost' #发送邮件服务器。默认为本机
} def get_conn():
conn = mysql.connector.connect(**config)
return conn def query_all(cur, sql, args):
'''
#参数说明
:param cur:
:param sql: 执行的sql
:param args: sql中的桉树
:return:
'''
print(sql)
print(args)
cur.execute(sql, args)
return cur.fetchall() def export_excle(filename, sql, outputpath):
'''
# 参数说明
:param filename: 文件名称
:param sql: 执行脚本
:param outputpath: 输出路径
:return:
'''
file_count = 0
try:
conn = get_conn()
cur = conn.cursor() # 查询结果
results = query_all(cur=cur, sql=sql, args=[end_date])
# 获取MYSQL里面的数据字段名称
fields = cur.description # 获取excle对象
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
# not isinstance(test[2][0],str) # 写入表头信息
for line in range(0, len(fields)):
if isinstance(fields[line][0], (bytes, bytearray)):
sheet.write(0, line, u'%s' % (fields[line][0]).decode())
else:
sheet.write(0, line, u'%s' % (fields[line][0])) # 写入数据信息
row = 1 # 第二行开始
col = 0
file_count =len(results)
for row in range(1, len(results)+1):
for col in range(0, len(fields)):
if isinstance(results[row - 1][col], (bytes, bytearray)):
sheet.write(row, col, u'%s' % results[row - 1][col].decode())
else:
sheet.write(row, col, u'%s' % results[row - 1][col])
#workbook.save("%s/%s.xls"%(oddir,filename) ) #filename
workbook.save(filename) finally:
if conn:
conn.close()
return file_count # 结果测试
if __name__ == "__main__":
# sql = input("请输入要查询的sql:")
#filename = input("请输入excle的名字")
file_count = export_excle(filename, sql, oddir) #执行导出结果
if os.path.exists(filename):
if file_count >=1:
print("邮件已经发送 %s"%(mail_list['attfilename']))
mail_list['attfilename'] = filename
print("邮件已经发送 %s"%(mail_list['attfilename']))
send_mail.sendmail(**mail_list)
else :
print("文件大小为空,请检查")
else :
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. 字节Android Native Crash治理之Memory Corruption工具原理与实践

    作者:字节跳动终端技术--庞翔宇 内容摘要 ​ MemCorruption工具是字节跳动AppHealth (Client Infrastructure - AppHealth) 团队开发的一款用于定 ...

  2. python操作MySQL数据库连接

    目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...

  3. 来自开发者的点赞!HMS Core荣获多个行业奖项

    2021年,HMS Core发布全新HMS Core 6,为全球开发者提供多终端.跨OS.全场景的华为移动服务核心能力,和开发者共同成长.通过和开发者在行业解决方案.业务场景创新和商业增长上的持续合作 ...

  4. 深坑react 引入antd无效问题

    //安装babel-plugin-import 第一步:npm install babel-plugin-import --save第二步:暴露webpack.config.js运行:npm run ...

  5. MySQL 事务的隔离级别及锁操作的一点点演示

    MySQL 版本:5.7 安装环境:MAC OS 一.测试数据 测试数据库:test:测试表:tt CREATE TABLE `tt` ( `id` int(11) DEFAULT NULL, `na ...

  6. [USACO18DEC]The Cow Gathering P

    首先可以思考一下每次能删去的点有什么性质. 不难发现,每次能删去的点都是入度恰好为 \(1\) 的那些点(包括 \(a_i \rightarrow b_i\) 的有向边). 换句话说,每次能删去的点既 ...

  7. Android Studio中添加对HttpClient的支持包

    感谢大佬:https://blog.csdn.net/gladiator0975/article/details/49177959 sdk6.0以后取消了HttpClient,设置android SD ...

  8. Java8-Consumer、Supplier、Predicate和Function方法总结

    这几个接口都在 java.util.function 包下的,分别是Consumer(消费型).supplier(供给型).predicate(谓词型).function(功能性): 那么,下面,我们 ...

  9. 【转】Nginx location写法

    转自:https://www.cnblogs.com/IPYQ/p/7889399.html nginx location正则写法 location = / { # 精确匹配 / ,主机名后面不能带任 ...

  10. Nginx的优化与防盗链

    Nginx的优化与防盗链 1.隐藏版本号 2.修改用户与组 3.缓存时间 4.日志切割 5.连接超时 6.更改进程数 7.配置网页压缩 8.配置防盗链 9.fpm参数优化 1.隐藏版本号: 可以使用 ...