python 量化交易,将处理完的数据,自动发送至邮箱——量化03
自动发送邮件代码
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量化交易,将处理完的数据,自动发送至邮箱 - 西瓜视频 (ixigua.com)
吸引人的中文标题:
- 自动化邮件发送代码,轻松管理订阅用户
- 数据库内容定时发送邮件,让订阅用户时刻掌握最新信息
- 通过Excel表格批量发送邮件,高效管理订阅用户
- 自动化发送邮件,实现个性化内容推送
- 快速发送邮件附件,提升工作效率
标签:
#自动化 #邮件发送 #数据库 #Excel #订阅管理 #python量化
版权声明:
作者:余汉波
链接:https://www.sanrenjz.com/2023/06/25/python-%e9%87%8f%e5%8c%96%e4%ba%a4%e6%98%93%ef%bc%8c%e5%b0%86%e5%a4%84%e7%90%86%e5%ae%8c%e7%9a%84%e6%95%b0%e6%8d%ae%ef%bc%8c%e8%87%aa%e5%8a%a8%e5%8f%91%e9%80%81%e8%87%b3%e9%82%ae%e7%ae%b1/
文章版权归作者所有,未经允许请勿转载。
THE END