今天大盘表现不错, 买的个股20cm涨停, 虽然只吃了9cm多的肉,有点不想写技术文章了。 突然瞟了一眼,大盘个股涨停较多,想起有同学问我有没有发送邮件提醒的例子,那就写一个查询涨停发送邮件的功能。毕竟有些同学不需要钉钉、企业微信提醒,喜欢看邮件。另外,最近好几个同学问怎么把代码部署到云服务器, 这里也推荐下我之前写的文章。虽然涨停,但我深知追涨停不可取,用AI写一首劝诫远离追涨停的打油诗:开盘涨停摆盛宴,
满仓杀入笑开颜。
封单如山夸海口,
尾盘泄洪泪涟涟。
追涨恰似扑灯蛾,
套牢方悟贪念多。
K线如猴窜天际,
账户浮沉荡秋千。
专家舌灿莲花绽,
连板妖股画饼圆。
七板狂欢半仓甩,
九成散户陷泥潭。
两油一涨全盘散,
三千绿韭泣荒原。
莫信暴富黄粱梦,
工资卡里见真仙。
忽闻邻户哭嚎声,
天台排队候神明。
清仓百万存银行,
方知稳字值千金。
最后附上源代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
备注下:我这里采用的163邮箱作为发送方, qq邮箱作为接收方。你完全可以改成自己的。 另外修改下定时任务的时间,我设置的收盘15:05执行定时任务。 写的这个样式有点low,暂时先这样。import yagmailimport pywencaiimport pandas as pdimport scheduleimport timefrom datetime import datetimeEMAIL_USER = "youremail@163.com" EMAIL_PASSWORD = "yourpassword" SMTP_SERVER = "smtp.163.com" RECEIVERS = ["receiver@qq.com"] def get_daily_limit_up(): """通过问财接口获取当日涨停数据(优化版)""" try: today = datetime.now().strftime('%Y%m%d') query = f"{today}涨停,非ST,非科创板,非北交所" df = pywencai.get(query=query, sort_key='连续涨停天数', sort_order='desc', loop=True) return df[['股票代码', '股票简称', '最新价']].rename( columns={'最新价': '涨停价(元)'} ) if not df.empty else pd.DataFrame() except Exception as e:
print(f"[{datetime.now()}] 数据获取失败: {str(e)}") return pd.DataFrame()def generate_email_content(df): """生成紧凑型邮件内容(带内联样式优化)""" csv_name = f"LimitUp_{datetime.now().strftime('%Y%m%d')}.csv" df.to_csv(csv_name, index=False, encoding='gbk') html_table = df.to_html( index=False, classes=None, border=0, justify='center', na_rep='-', header=False ).split('')[1].replace('', '') custom_thead = """ | 股票代码 | | 股票简称 | | 涨停价(元) |
""" html_content = f""" font-family: 'Microsoft YaHei', Arial, sans-serif;
max-width: 800px; margin: 0 auto; padding: 0 !important; "> color: #2c3e50;
border-bottom: 2px solid #3498db; padding-bottom: 5px; margin: 0 0 5px 0 !important; font-size: 18px; "> {datetime.now().strftime('%Y-%m-%d')} 涨停统计(共 {len(df)} 只) width: 100%; border-collapse: collapse; margin: 0; padding: 0; font-size: 14px; "> {custom_thead} {html_table}
color: #95a5a6;
font-size: 12px; margin: 10px 0 0 0; "> 数据来源:同花顺问财 | 生成时间:{datetime.now().strftime('%H:%M:%S')} """ return html_content, [csv_name]def send_report(): """邮件发送核心逻辑(含异常重试)""" try: if datetime.now().weekday() >= 5: print(f"[{datetime.now()}] 非交易日不发送") return df = get_daily_limit_up() if df.empty: print(f"[{datetime.now()}] 无有效涨停数据") return html_body, attachments = generate_email_content(df) with yagmail.SMTP(user=EMAIL_USER, password=EMAIL_PASSWORD, host=SMTP_SERVER) as yag: yag.send( to=RECEIVERS, subject=f"{datetime.now().strftime('%m%d')}涨停分析报告", contents=html_body, attachments=attachments ) print(f"[{datetime.now()}] 邮件发送成功") except Exception as e:
print(f"[{datetime.now()}] 发送失败: {str(e)}") time.sleep(60) send_report()if __name__ == '__main__': schedule.every().day.at("15:05").do(send_report) print(f"[{datetime.now()}] 定时任务已启动...") while True: schedule.run_pending() time.sleep(60)
如果对投资感兴趣,欢迎关注我这个号。 我时而去这个号胡扯下投资的事情,准备改个名(想了想,就叫 子晓聊投资, 名称还没申请下来)。为了监管风险,就分享一些投资上的心得。