python 量化交易,将处理完的数据,自动发送至邮箱——量化03
off999 2024-12-13 15:36 15 浏览 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中非常有用的库
相关推荐
- Python四种常用的高阶函数,你会用了吗
-
每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试1、什么是高阶函数把函数作为参数传入,这样的函数称为高阶函数例如:...
- Python之函数进阶-函数加强(上)(python函数的作用增强代码的可读性)
-
一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...
- 数据分析-一元线性回归分析Python
-
前面几篇介绍了数据的相关性分析,通过相关性分析可以看出变量之间的相关性程度。如果我们已经发现变量之间存在明显的相关性了,接下来就可以通过回归分析,计算出具体的相关值,然后可以用于对其他数据的预测。本篇...
- python基础函数(python函数总结)
-
Python函数是代码复用的核心工具,掌握基础函数的使用是编程的关键。以下是Python函数的系统总结,包含内置函数和自定义函数的详细用法,以及实际应用场景。一、Python内置函数(...
- python进阶100集(9)int数据类型深入分析
-
一、基本概念int数据类型基本上来说这里指的都是整形,下一届我们会讲解整形和浮点型的转化,以及精度问题!a=100b=a这里a是变量名,100就是int数据对象,b指向的是a指向的对象,...
- Python学不会来打我(73)python常用的高阶函数汇总
-
python最常用的高阶函数有counter(),sorted(),map(),reduce(),filter()。很多高阶函数都是将一个基础函数作为第一个参数,将另外一个容器集合作为第二个参数,然...
- python中有哪些内置函数可用于编写数值表达式?
-
在Python中,用于编写数值表达式的内置函数很多,它们可以帮助你处理数学运算、类型转换、数值判断等。以下是常用的内置函数(不需要导入模块)按类别归类说明:一、基础数值处理函数函数作用示例ab...
- 如何在Python中获取数字的绝对值?
-
Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...
- 【Python大语言模型系列】使用dify云版本开发一个智能客服机器人
-
这是我的第359篇原创文章。一、引言上篇文章我们介绍了如何使用dify云版本开发一个简单的工作流:【Python大语言模型系列】一文教你使用dify云版本开发一个AI工作流(完整教程)这篇文章我们将引...
- Python3.11版本使用thriftpy2的问题
-
Python3.11于2022年10月24日发布,但目前thriftpy2在Python3.11版本下无法安装,如果有使用thriftpy2的童鞋,建议晚点再升级到最新版本。...
- uwsgi的python2+3多版本共存(python多版本兼容)
-
一、第一种方式(virtualenv)1、首先,机器需要有python2和python3的可执行环境。确保pip和pip3命令可用。原理就是在哪个环境下安装uwsgi。uwsgi启动的时候,就用的哪个...
- 解释一下Python脚本中版本号声明的作用
-
在Python脚本中声明版本号(如__version__变量)是一种常见的元数据管理实践,在IronPython的兼容性验证机制中具有重要作用。以下是版本号声明的核心作用及实现原理:一、版本号...
- 除了版本号声明,还有哪些元数据可以用于Python脚本的兼容性管理
-
在Python脚本的兼容性管理中,除了版本号声明外,还有多种元数据可以用于增强脚本与宿主环境的交互和验证。以下是一些关键的元数据类型及其应用场景:一、环境依赖声明1.Python版本要求pyth...
- 今年回家没票了?不,我有高科技抢票
-
零基础使用抢票开源软件Py12306一年一度的抢票季就要到了,今天给大家科普一下一款软件的使用方法。软件目前是开源的,禁止用于商用。首先需要在电脑上安装python3.7,首先从官网下载对应的安装包,...
- 生猛!春运抢票神器成GitHub热榜第一,过年回家全靠它了
-
作者:车栗子发自:凹非寺量子位报道春节抢票正在如火如荼的进行,过年回家那肯定需要抢票,每年的抢票大战,都是一场硬战,没有一个好工具,怎么能上战场死锁呢。今天小编推荐一个Python抢票工具,送到...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)