在量化交易中,邮件通知是重要的风控与状态反馈工具,可实时推送策略成交记录、盈亏统计、异常警报等关键信息。以下是适配量化场景的QQ邮件Python实现指南,涵盖环境配置、核心功能、量化场景适配与实战示例,兼顾易用性与稳定性。
一、核心原理与依赖准备
1. 实现核心
依托Python内置的smtplib库(用于SMTP协议通信)和email库(用于构建邮件内容),通过QQ邮箱的SMTP服务器(smtp.qq.com)实现邮件发送,支持文本内容、附件上传,完全满足量化交易的通知需求。
2. 前置依赖
- • 环境要求:Python 3.6+(兼容主流量化平台如QMT、VN.PY);
- • 库依赖:无需额外安装第三方库,直接使用Python标准库(
smtplib、email); - • 配置依赖:需提前获取QQ邮箱的SMTP授权码(关键凭证,替代密码登录)。
3. QQ邮箱SMTP授权码获取步骤
- 2. 下滑找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」,开启「IMAP/SMTP服务」;
- 3. 点击「生成授权码」,按提示完成身份验证(如短信验证),获取16位授权码(保存好,仅显示一次)。
二、量化适配版代码实现(可直接复用)
以下代码支持配置灵活读取、多类型通知、日志附件上传,可直接嵌入量化策略:
# -*- coding: utf-8 -*-
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
import os
import json
classQuantEmailSender:
"""量化交易专用QQ邮件发送类,支持文本通知、日志附件上传"""
def__init__(self, sender_qq, sender_auth_code, receiver, smtp_server="smtp.qq.com", smtp_port=465):
"""
初始化邮件发送器
:param sender_qq: 发送方QQ邮箱(如xxx@qq.com)
:param sender_auth_code: QQ邮箱SMTP授权码(16位)
:param receiver: 接收方邮箱(可单个或多个,多个用列表如["a@qq.com", "b@163.com"])
:param smtp_server: SMTP服务器地址(QQ邮箱固定为smtp.qq.com)
:param smtp_port: SMTP端口(QQ邮箱SSL加密端口固定为465)
"""
self.sender_qq = sender_qq
self.sender_auth_code = sender_auth_code
self.receiver = receiver ifisinstance(receiver, list) else [receiver]
self.smtp_server = smtp_server
self.smtp_port = smtp_port
defcreate_email(self, subject, content, content_type="plain", attachment_paths=None):
"""
构建邮件内容(支持文本、HTML格式,多附件上传)
:param subject: 邮件主题(量化场景建议包含策略名、通知类型)
:param content: 邮件正文(支持纯文本plain或HTML格式)
:param content_type: 内容格式(plain=纯文本,html=富文本)
:param attachment_paths: 附件路径列表(如["strategy_log.log", "pnl_stats.csv"])
:return: 构建好的邮件对象
"""
# 创建带附件的邮件对象
msg = MIMEMultipart()
# 设置发件人、收件人、主题(支持中文编码)
msg["From"] = Header(f"量化策略通知 <{self.sender_qq}>", "utf-8")
msg["To"] = Header("; ".join(self.receiver), "utf-8") # 多收件人用分号分隔
msg["Subject"] = Header(subject, "utf-8")
# 添加正文内容
msg.attach(MIMEText(content, content_type, "utf-8"))
# 上传附件(支持多个文件)
if attachment_paths:
for attachment_path in attachment_paths:
if os.path.exists(attachment_path):
# 读取附件文件
withopen(attachment_path, "rb") as f:
# 构建附件对象
mime = MIMEBase("application", "octet-stream")
mime.set_payload(f.read())
encoders.encode_base64(mime) # 编码为base64格式(兼容邮件传输)
# 设置附件文件名(保留原文件名,支持中文)
filename = os.path.basename(attachment_path)
mime.add_header("Content-Disposition", "attachment",
filename=(Header(filename, "utf-8").encode()))
msg.attach(mime)
else:
print(f"警告:附件文件不存在,跳过上传:{attachment_path}")
return msg
defsend(self, subject, content, content_type="plain", attachment_paths=None):
"""
发送邮件(含异常捕获与量化场景日志输出)
:param subject: 邮件主题
:param content: 邮件正文
:param content_type: 内容格式(plain/html)
:param attachment_paths: 附件路径列表
:return: 发送成功返回True,失败返回False
"""
msg = self.create_email(subject, content, content_type, attachment_paths)
try:
# 连接SMTP服务器(SSL加密,保障传输安全)
with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as smtp_obj:
# 登录QQ邮箱(用授权码替代密码)
smtp_obj.login(self.sender_qq, self.sender_auth_code)
# 发送邮件(from_addr, to_addrs, msg_as_string)
smtp_obj.sendmail(self.sender_qq, self.receiver, msg.as_string())
print(f"✅ 量化通知邮件发送成功!主题:{subject} | 接收人:{self.receiver}")
returnTrue
except Exception as e:
print(f"❌ 量化通知邮件发送失败!主题:{subject} | 错误信息:{str(e)}")
returnFalse
# ===================== 量化场景实战示例 =====================
if __name__ == "__main__":
# 1. 配置邮件参数(建议存入配置文件,避免硬编码)
email_config = {
"sender_qq": "your_qq@qq.com", # 替换为你的QQ邮箱
"sender_auth_code": "your_auth_code", # 替换为你的SMTP授权码
"receiver": ["target@qq.com", "backup@163.com"] # 接收人(可多个)
}
# 2. 初始化邮件发送器
sender = QuantEmailSender(
sender_qq=email_config["sender_qq"],
sender_auth_code=email_config["sender_auth_code"],
receiver=email_config["receiver"]
)
# 场景1:策略成交通知(纯文本)
trade_content = """
量化OK_成交驱动网格策略成交通知:
策略名称:量化OK_成交驱动网格策略_V3
成交时间:2026-01-15 10:30:25
标的代码:300476.SZ
成交类型:买入
成交价格:15.80元
成交数量:100股
持仓状态:当前持仓500股(未达最大持仓2000股)
"""
sender.send(
subject="[量化成交] 网格策略买入成交通知",
content=trade_content,
content_type="plain"
)
# 场景2:策略异常警报(带日志附件)
error_content = """
量化OK_成交驱动网格策略异常警报:
异常时间:2026-01-15 14:20:10
异常类型:ATR波动率计算失败
涉及标的:300476.SZ
异常描述:获取历史数据不足14周期,无法计算ATR值
处理建议:检查标的行情数据或调整ATR周期参数
"""
sender.send(
subject="[量化警报] 策略波动率计算异常",
content=error_content,
content_type="plain",
attachment_paths=["strategy_log.log", "error_traceback.txt"] # 上传日志附件
)
# 场景3:每日盈亏统计(HTML格式,更美观)
pnl_html = """
<html>
<body>
<h3>量化策略每日盈亏统计(2026-01-15)</h3>
<table border="1">
<tr><<th>策略名称</</th><<th>当日盈利</</th><<th>累计盈利</</th><<th>胜率</</th></tr>
<tr><td>网格策略V3</td><td>+1280元</td><td>+35600元</td><td>68%</td></tr>
<tr><td>趋势跟踪策略</td><td>-450元</td><td>+28900元</td><td>55%</td></tr>
</table>
<p>详细盈亏明细见附件</p>
</body>
</html>
"""
sender.send(
subject="[量化统计] 2026-01-15 策略盈亏报告",
content=pnl_html,
content_type="html",
attachment_paths=["daily_pnl.csv"] # 上传CSV格式明细
)
三、量化场景核心适配特性
1. 多类型通知支持
- • 成交通知:实时推送买入/卖出成交记录,包含标的、价格、数量等关键信息;
- • 风控警报:触发止损、保证金不足、持仓超限等风险时,立即发送警报邮件;
- • 统计报告:每日/每周自动发送盈亏统计、交易频次、策略表现等汇总信息;
- • 异常通知:策略报错、数据获取失败、网络中断等情况,附带日志附件便于排查。
2. 关键优化点(适配量化需求)
- • 多收件人支持:可同时推送至个人邮箱、团队协作邮箱,避免遗漏;
- • 附件上传功能:支持日志文件(
.log)、盈亏明细(.csv)、策略报告(.xlsx)等量化常用文件; - • 中文兼容:发件人、主题、附件名均支持中文编码,避免乱码;
- • 异常捕获:发送失败时输出详细错误信息,便于量化策略日志排查;
- • 配置灵活:支持硬编码(测试用)或读取配置文件(实盘用,更安全)。
3. 配置文件读取建议(实盘推荐)
实盘时避免硬编码敏感信息,可将配置存入JSON文件(如email_config.json):
{
"sender_qq":"your_qq@qq.com",
"sender_auth_code":"your_auth_code",
"receiver":["you@qq.com","colleague@163.com"]
}
读取配置的代码:
withopen("email_config.json", "r", encoding="utf-8") as f:
email_config = json.load(f)
sender = QuantEmailSender(
sender_qq=email_config["sender_qq"],
sender_auth_code=email_config["sender_auth_code"],
receiver=email_config["receiver"]
)
四、实战注意事项(量化场景重点)
1. 安全性保障
- • 授权码保密:SMTP授权码等同于邮箱密码,切勿泄露或存入代码仓库;
- • 配置隔离:实盘环境与测试环境分开配置,避免测试邮件干扰实盘通知;
- • 传输加密:强制使用SSL加密端口(465),防止数据传输过程中被截取。
2. 稳定性优化
- • 网络适配:量化平台(如QMT)需确保网络权限开放,允许访问SMTP服务器(
smtp.qq.com:465); - • 重试机制:关键通知(如风控警报)可添加重试逻辑,避免单次网络波动导致发送失败:
defsend_with_retry(self, subject, content, content_type="plain", attachment_paths=None, retry=2):
for i inrange(retry + 1):
ifself.send(subject, content, content_type, attachment_paths):
returnTrue
if i < retry:
print(f"重试发送({i+1}/{retry})...")
time.sleep(3) # 重试间隔3秒
returnFalse
- • 附件大小限制:QQ邮箱单封邮件附件总大小不超过50MB,量化日志文件建议按日分割,避免超限。
3. 合规与频率控制
- • 避免垃圾邮件:量化通知邮件频率不宜过高(如日内成交通知可合并发送),避免触发QQ邮箱反垃圾机制;
- • 正文规范:邮件主题明确(含策略名、通知类型),正文简洁明了,便于快速查看关键信息。
五、总结
该Python实现基于标准库开发,无需额外依赖,适配量化交易的各类通知场景,核心优势在于:
- 1. 配置简单:仅需QQ邮箱和SMTP授权码,5分钟即可搭建完成;
- 2. 功能全面:支持文本/HTML内容、多附件、多收件人,满足量化全场景需求;
- 3. 稳定可靠:含异常捕获、加密传输,适配量化平台的实盘运行环境。
在量化策略中集成该工具后,可实现“策略运行状态实时掌握、风险警报及时响应、交易记录自动归档”,大幅提升交易的可控性与效率。