问题描述
邮件失败:[Errno-2] Name or service not known
解决方案
在 ptrade 量化交易平台中,你可以使用内置的 set_email_info 函数来配置邮件发送功能。当策略在交易过程中发生报错终止时,系统会自动向你配置的邮箱发送提示邮件。
1. 如何配置发送 QQ 邮件
根据 ptrade API 文档,目前系统仅支持设置 QQ 邮箱,并且发送方与接收方必须是同一个邮箱地址。
接口说明
set_email_info(email_address, smtp_code, email_subject)
参数说明
- email_address (str):你的 QQ 邮箱地址(例如:
12345678@qq.com)。 - smtp_code (str):QQ 邮箱的 SMTP 授权码(注意:不是你的 QQ 密码,需要在 QQ 邮箱设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中生成)。
- email_subject (str):邮件的主题(例如:
【PTrade量化-策略异常提醒】)。
示例代码
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 设置邮件信息,当策略异常终止时会触发发送
is_success = set_email_info("你的QQ号@qq.com", "你的SMTP授权码", "【PTrade实盘-策略异常终止提醒】")
log.info("邮件配置状态: %s" % is_success)
def before_trading_start(context, data):
# 模拟一个异常来测试邮件发送
# raise BaseException("测试发送报错邮件")
pass
def handle_data(context, data):
pass
2. 为什么会报错 [Errno-2] Name or service not known?
如果你在配置或触发邮件发送时遇到了 [Errno-2] Name or service not known 错误,这通常不是你的代码写错了,而是运行环境的网络限制导致的。
错误原因深度解析
这个错误是一个底层的 DNS 解析错误。当 ptrade 尝试连接 QQ 邮箱的 SMTP 服务器(通常是 smtp.qq.com)时,它需要将这个域名解析为 IP 地址。如果解析失败,就会报这个错。
在量化实盘交易中,券商为了保证交易系统的绝对安全,通常会将 ptrade 所在的服务器部署在严格隔离的内网环境中。这意味着服务器无法访问外部的互联网(外网),自然也就无法解析 smtp.qq.com 的域名,从而导致邮件发送失败。
解决办法
- 联系券商客服/客户经理:这是最直接有效的办法。你需要向券商确认当前的 ptrade 环境是否支持发送邮件。如果支持,可能需要他们为你所在的服务器开通访问
smtp.qq.com的网络白名单或 DNS 解析权限。 - 检查本地网络(如果是投研环境):如果你是在本地客户端的投研/回测环境中遇到此问题,请检查你本机的网络连接是否正常,或者是否有防火墙/代理拦截了 SMTP 端口(通常是 465 或 25)。但在实盘/模拟盘服务器上,大概率是券商的网络隔离策略所致。
- 替代方案:如果券商明确表示出于安全考虑无法开通外网邮件权限,你可以考虑使用 ptrade 提供的其他通知方式(如企业微信通知
send_qywx,前提是券商支持并配置了相关通道),或者通过轮询本地日志文件的方式在外部监控策略状态。