python 量化交易,将处理完的数据,自动发送至邮箱——量化03
off999 2024-12-13 15:36 13 浏览 0 评论
自动发送邮件代码
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
from email.utils import formataddr
import sqlite3
from datetime import datetime, timedelta, time
# 批量自动化给订阅用户发送邮件
# 查询并提取场内基金网格交易数据表'fund_grid_trading'近20分钟生成的内容,保存为pd
def get_recent_data(table_name):
# 连接数据库
conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db')
c = conn.cursor()
# 获取当前时间和20分钟前的时间
now = datetime.now()
twenty_minutes_ago = now - timedelta(minutes=20)
# 查询最近20分钟的数据
query = f"SELECT * FROM {table_name} WHERE 时间 BETWEEN ? AND ?"
results = pd.read_sql_query(query, conn, params=(twenty_minutes_ago.strftime('%Y-%m-%d %H:%M'), now.strftime('%Y-%m-%d %H:%M')))
# 关闭数据库连接
conn.close()
return results
def send_email(receiver, table_name, file_path1=None, file_path2=None):
# 邮件发送方的信息
sender = '电子邮箱' # 与下方的SMTP保持一致——smtp_obj = smtplib.SMTP_SSL('smtp.exmail.qq.com', 465)
password = '客户端密码'
# 邮件主题和内容
subject = '微信公众号“余汉波”的订阅邮件'
# 获取当前时间的时间部分
current_time = datetime.now().time()
# 根据条件设置邮件内容
if table_name == 'fund_grid_trading':
content = '场内基金网格交易策略'
elif table_name == 'trade_func':
if time(10, 0) < current_time < time(11, 0):
content = 'A股、港股和场内基金交易策略'
elif time(21, 0) < current_time < time(22, 0):
content = '美股交易策略'
else:
content = '微信公众号“余汉波”的订阅邮件'
else:
content = '微信公众号“余汉波”的订阅邮件'
# 创建邮件对象
message = MIMEMultipart()
message['From'] = formataddr((Header(sender, 'utf-8').encode(), sender))
message['To'] = formataddr((Header(receiver, 'utf-8').encode(), receiver))
message['Subject'] = Header(subject, 'utf-8')
filtered_data = get_recent_data(table_name)
# 检查结果是否为空
if filtered_data.empty:
print('结果为空,不发送邮件')
return
html = filtered_data.to_html(index=False)
# 添加邮件正文
# message.attach(MIMEText(content, 'plain', 'utf-8'))
message.attach(MIMEText(content + html, 'html'))
# 添加附件1
if file_path1 is not None:
with open(file_path1, 'rb') as f:
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', file_path1.split('\\')[-1]))
message.attach(attachment)
# 添加附件2
if file_path2 is not None:
with open(file_path2, 'rb') as f:
attachment = MIMEBase('application', 'octet-stream')
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', file_path2.split('\\')[-1]))
message.attach(attachment)
# 发送邮件,若切换邮箱需要修改SMTP
try:
smtp_obj = smtplib.SMTP_SSL('smtp.exmail.qq.com', 465)
smtp_obj.login(sender, password)
smtp_obj.sendmail(sender, receiver, message.as_string())
print('邮件发送成功')
except smtplib.SMTPException as e:
print('邮件发送失败:', e)
# 读取excel表格中的邮箱地址,参数有三个,第1个是邮箱的表,第2和第3是附件,可以省略。
def send_emails_from_excel(sheet_name, table_name, file_path1=None, file_path2=None):
# 读取Excel文件
df = pd.read_excel(r'D:\wenjian\python\smart\data\sub_user.xlsx', sheet_name=sheet_name)
# 获取邮箱列数据
emails = df['邮箱']
# 循环发送邮件并打印
for receiver in emails:
send_email(receiver, table_name, file_path1, file_path2)
if __name__ == '__main__':
# print(get_recent_data('fund_grid_trading'))
send_emails_from_excel('一般', 'fund_grid_trading')
代码说明
代码有三个自定义函数:
- get_recent_data(table_name):查询并提取近20分钟生成的内容,保存为 pd,参数为数据库的表名称。
- send_email(receiver, table_name, file_path1=None, file_path2=None):读取 excel 表中的邮箱地址,将函数 get_recent_data(table_name)生成的 pd 转成 html,并发送。参数有 4 个,第一个参数是下面函数的函数,不用理它;第二个参数是数据库的表名称;第三和第四个参数都为增加的附件,若没有附件不用理它,默认为没有。
- send_emails_from_excel(sheet_name, table_name, file_path1=None, file_path2=None):读取excel表格中的邮箱地址,参数有4个,第1个是邮箱的表,第2是数据库表的名称,第3和第4是附件,可以省略。
需修改的代码
- conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db'):改成你的数据库的路径,进行连接。
- twenty_minutes_ago = now - timedelta(minutes=20):修改发送的条件,比如这里是发送近 20 分钟获取数据的内容。
- sender = '电子邮箱':修改成发件人邮箱地址。
- password = '客户端密码':修改成发件人的客户端密码,注意并不是登陆密码,是 SMTP 客户端上面的密码。
- 根据条件设置邮件内容:这部分是判断数据表的条件,满足不同的条件发送不同的内容,看自己的需求要不要这部分内容。
- smtp_obj = smtplib.SMTP_SSL('smtp.exmail.qq.com', 465):修改邮箱对应的 SMTP 服务器。
- df = pd.read_excel(r'D:\wenjian\python\smart\data\sub_user.xlsx', sheet_name=sheet_name):修改接收方的邮箱,这里是存在放在 excel 中,需要修改路径。
- send_emails_from_excel('一般', 'fund_grid_trading'):修改“一般”的 excel 路径的表,修改 'fund_grid_trading'需要发送数据库数据的表名称。若需发送附件,在括号中直接增加附件的路径,最多支持 2 个附件;若要发送多个附件,需对函数 send_email(receiver, table_name, file_path1=None, file_path2=None)进行增加。
- 上一篇:Python之并发+网络编程
- 下一篇:【rq】一个Python中非常有用的库
相关推荐
- 独家 | 5 个Python高级特性让你在不知不觉中成为Python高手
-
你已经使用Python编程了一段时间,编写脚本并解决各种问题。是你的水平出色吗?你可能只是在不知不觉中利用了Python的高级特性。从闭包(closure)到上下文管理器(contextmana...
- Python装饰器
-
Python装饰器是一种用于修改函数或类的行为的特殊语法。它们允许在不修改原始代码的情况下,通过将函数或类作为参数传递给另一个函数来添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返...
- 中高阶Python常规用法--上下文管理器
-
Python以简单性和通用性著称,是一种深受全球开发人员喜爱的编程语言。它提供了大量的特性和功能,使编码成为一种愉快的体验。在这些功能中,一个经常被新手忽视的强大工具是上下文管理器。上下文管理器是高...
- Python小案例67- 装饰器
-
Python装饰器是一种用于修改函数或类的行为的特殊语法。它们允许在不修改原始代码的情况下,通过将函数或类作为参数传递给另一个函数来添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返...
- python常用的语法糖
-
概念Python的语法糖(SyntacticSugar)是指那些让代码更简洁、更易读的语法特性,它们本质上并不会增加新功能,但能让开发者更高效地编写代码。推导式写法推导式是Python最经典的...
- python - 常用的装饰器 decorator 有哪些?
-
python编程中使用装饰器(decorator)工具,可以使代码更简洁清晰,提高代码的重用性,还可以为代码维护提供方便。对于python初学者来说,根据装饰器(decorator)的字面意思并不...
- python数据缓存怎么搞 ?推荐一个三方包供你参考,非常简单好用。
-
1.数据缓存说明数据缓存可以说也是项目开发中比不可少的一个工具,像我们测试的系统中,你都会见到像Redis一样的数据缓存库。使用缓存数据库的好处不言而喻,那就是效率高,简单数据直接放在缓存中...
- 用于时间序列数据的Graphite监视工具
-
结合第三方工具,Graphite为IT性能监控提供了许多好处。本文介绍其核心组件,包括Carbon、Whisper以及安装的基本准则。Graphite监视工具可实时或按需,大规模地绘制来自多个来源的时...
- Python3+pygame实现的坦克大战
-
一、显示效果二、代码1.说明几乎所有pygame游戏,基本都遵循一定的开发流程,大体如下:初始化pygame创建窗口while循环检测以及处理事件(鼠标点击、按键等)更新UI界面2.代码创建一个m...
- Python之鸭子类型:一次搞懂with与上下文装饰器
-
引言在鸭子类型的理念的基础之上,从关注类型,转变到关注特性和行为。结合Python中的魔法函数的体系,我们可以将自定义的类型,像内置类型一样被使用。今天这篇文章中,接着该话题,继续聊一下with语法块...
- Python必会的50个代码操作
-
学习Python时,掌握一些常用的程序操作非常重要。以下是50个Python必会的程序操作,主要包括基础语法、数据结构、函数和文件操作等。1.HelloWorldprint("Hello,...
- 一文掌握Python 中的同步和异步
-
同步代码(Sync)同步就像在一个流水线上工作,每个任务都等待前一个任务完成。示例:机器A切割钢板→完成后,机器B钻孔→完成后,机器C上色。在Python中,同步代码看起来像这样:im...
- python 标注模块timeit: 测试函数的运行时间
-
在Python中,可以使用内置的timeit模块来测试函数的运行时间。timeit模块提供了一个简单的接口来测量小段代码的执行时间。以下是使用timeit测试函数运行时间的一般步骤:导入...
- Python带你找回童年的万花尺
-
还记得小时候的万花尺吧?这么画:一点也不费脑筋,就可以出来这么多丰富多彩的复杂几何图形。具体而言,可以用万花尺玩具(如图2-1所示)来绘制数学曲线。这种玩具由两个不同尺寸的塑料齿轮组成,一大一小。小的...
- Python 时间模块深度解析:从基础到高级的全面指南
-
直接上干货一、时间模块核心类介绍序号类名说明1datetime.datetime表示一个具体的日期和时间,结合了日期和时间的信息。2datetime.date表示一个具体的日期。3datetime.t...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)