🌟 如何使用Python打造自动科技新闻摘要邮件机器人

📧 附完整代码和详细部署指南


📰 项目简介

无需手动操作,每天自动抓取CCTV科技频道的最新新闻,通过Python爬虫技术处理数据,生成美观的响应式HTML邮件,并使用GitHub Actions实现定时自动化发送

🌟 前言

你是否每天都想了解最新的科技动态,却苦于没有时间浏览各大科技网站?今天我要分享一个我自己开发的实用小项目——自动CCTV科技新闻摘要邮件机器人,它能够通过Python脚本自动抓取CCTV科技频道的最新新闻,使用SMTP协议发送美观的HTML格式邮件,并通过GitHub Actions实现完全自动化的定时运行,让你每天轻松获取最新的科技新闻。

✨ 项目价值

这个项目不仅可以帮助你节省时间,自动获取科技新闻,还可以作为学习Python爬虫、邮件发送和自动化部署的实用案例。

✨ 项目亮点

  • 全自动运行

    无需手动操作,通过GitHub Actions实现每天定时发送

  • 📊 真实数据

    直接从CCTV科技频道获取最新新闻,使用Python爬虫技术确保数据准确性

  • 🎨 美观邮件

    响应式HTML格式邮件,支持各种设备,专业的邮件模板设计

  • 🔒 稳定可靠

    3次重试机制,确保Python爬虫数据抓取成功率

  • 🚀 易于部署

    支持GitHub Actions自动化运行,包含详细的自动化部署指南

  • 💻 免费工具

    完全免费的自动化工具,无需服务器成本

🛠️ 技术栈

技术用途
Python 3.9核心编程语言,用于开发Python爬虫和自动化脚本
Requests网络请求库,用于抓取CCTV科技频道数据
BeautifulSoup4HTML解析库,用于处理和提取网页数据
SMTP_SSL安全邮件发送协议,用于通过SMTP服务器发送邮件
GitHub Actions自动化运行平台,用于实现定时任务和自动化部署
JSON数据存储格式,用于存储和处理新闻数据
Regular Expressions正则表达式,用于JSONP数据解析

📁 项目结构

├── crawl_news.py         # 新闻抓取脚本
├── send_email.py         # 邮件发送脚本
├── news_data.json        # 新闻数据存储
└── .github/workflows/
    └── daily-news.yml    # GitHub Actions配置
  

提示:项目结构清晰简洁,包含了所有必要的文件,易于理解和维护。

核心功能解析

智能新闻抓取

项目使用JSONP API直接从CCTV科技频道获取真实新闻数据,而非简单的HTML解析,确保了数据的准确性和完整性。

🐍 部分代码:crawl_news.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def crawl_cctv_tech_news():
url = "https://news.cctv.com/tech/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}

try:
response = requests.get(url, headers=headers, timeout=15)
response.encoding = "utf-8"

# 保存页面内容以便分析
with open("page_content.html", "w", encoding="utf-8") as f:
f.write(response.text)

soup = BeautifulSoup(response.text, "html.parser")

# 获取所有a标签
all_links = []

# 方法1:获取所有a标签
for a in soup.find_all("a", href=True):
text = a.get_text(strip=True)
href = a.get("href")

if text and len(text) > 5:
# 确保链接完整
if not href.startswith("http"):
href = "https://news.cctv.com" + href
all_links.append((text, href))

代码说明:这段代码使用BeautifulSoup库解析CCTV科技频道的HTML页面,提取所有有效的新闻链接。

QQ邮箱配置与邮件发送

QQ邮箱授权码获取步骤

  1. 登录QQ邮箱:打开 mail.qq.com
  2. 进入设置:点击顶部导航栏的「设置」按钮
  3. 选择账户:在左侧菜单中选择「账号与安全」选项
  4. 开启SMTP服务:找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」部分
  5. 生成授权码:点击「生成授权码」,按照提示操作获取16位授权码

📷 操作截图

QQ邮箱SMTP设置页面,开启SMTP服务并生成授权码

📧 部分代码:send_email.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 创建邮件
msg = MIMEMultipart('alternative')
msg["From"] = smtp_user
msg["To"] = to_email
msg["Subject"] = Header(f"CCTV科技新闻摘要 ({today})", "utf-8")

# 添加文本和HTML内容
text_part = MIMEText(summary, "plain", "utf-8")
html_part = MIMEText(html_content, "html", "utf-8")

msg.attach(text_part)
msg.attach(html_part)

try:
# 使用SMTP_SSL直接创建SSL连接
import ssl
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

server = smtplib.SMTP_SSL(smtp_server, 465, context=context, timeout=30)
print(f"成功创建SMTP_SSL对象: {smtp_server}:465")

server.login(smtp_user, smtp_password)
print(f"成功登录邮箱: {smtp_user}")

server.send_message(msg)
print("邮件发送成功")
print(f"发送到:{to_email}")
print(f"主题:CCTV科技新闻摘要 ({today})")

代码说明:这段代码使用SMTP_SSL创建安全连接,发送包含HTML和文本内容的邮件,确保邮件能够正确送达。

自动化部署(GitHub Actions)

通过GitHub Actions配置,实现每日自动运行,无需服务器。

时区说明

  • GitHub服务器使用UTC时区
  • 中国时区是UTC+8,所以UTC时间02:44:59对应中国时间10:44:59
  • 以下配置设置为UTC时间02:45运行,对应中国时间10:45

邮件效果展示

📱 邮件效果

电脑端邮件效果,美观的HTML格式邮件,响应式设计

🚀 快速开始

📁 创建项目文件

创建以下三个核心文件,构建完整的Python自动化新闻邮件系统:

📄 crawl_news.py

  • 功能:使用Python爬虫技术从CCTV科技频道抓取最新新闻
  • 特性:3次重试机制,确保Python爬虫数据抓取成功率

📄 send_email.py

  • 功能:生成美观的响应式HTML邮件并通过SMTP协议发送
  • 特性:响应式设计,支持各种设备,专业邮件模板

📄 .github/workflows/daily-news.yml

  • 功能:通过GitHub Actions实现每日自动运行的定时任务
  • 特性:支持手动触发测试,方便调试和验证

🔧 安装依赖

1
pip install requests beautifulsoup4

🖥️ 本地测试

1
2
3
4
5
6
7
8
9
10
11
# 抓取新闻
python crawl_news.py

# 从环境变量读取配置
smtp_server = os.environ.get('SMTP_SERVER', 'smtp.qq.com') # SMTP服务器地址
smtp_user = os.environ.get('SENDER_EMAIL', '自己的qq邮箱') # 发件人邮箱
smtp_password = os.environ.get('SENDER_PASSWORD', '自己的授权码') # 发件人密码或授权码


# 运行发送脚本
python send_email.py

📷 操作截图

📦 创建GitHub仓库

按照以下步骤创建GitHub仓库:

  1. 登录GitHub:打开 github.com
  2. 创建新仓库:点击右上角的「+」按钮,选择「New repository」
  3. 填写仓库信息
    • Repository name: daily-tech-news
    • Description: 自动科技新闻摘要邮件机器人
    • 选择 Public 或 Private
    • 点击「Create repository」

📷 操作截图

📤 上传项目代码

使用GitHub网页界面上传文件:

  1. 进入仓库:打开您创建的GitHub仓库页面
  2. 上传文件
    • 点击「Add file」按钮
    • 选择「Upload files」选项
  3. 选择文件
    • 拖拽或点击选择您的项目文件(crawl_news.py、send_email.py、news_data.json )
    • 同时创建 .github/workflows/ 目录和 daily-news.yml 文件
  4. 提交更改
    • 在页面底部填写提交信息(如 “初始化项目”)
    • 点击「Commit changes」按钮完成上传

📷 操作截图

⚙️ 配置GitHub Actions

.github/workflows/daily-news.yml 文件中添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
name: 每日科技新闻摘要

on:
schedule:
# 每天UTC时间02:00运行,对应中国时间10:00
- cron: '0 2 * * *'
workflow_dispatch:
# 允许手动触发

jobs:
send-news:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: 设置时区为中国时区
run: |
echo "TZ=Asia/Shanghai" >> $GITHUB_ENV

- name: 设置Python环境
uses: actions/setup-python@v5
with:
python-version: '3.9'

- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install requests beautifulsoup4

- name: 运行爬取脚本
run: python crawl_news.py

- name: 运行邮件发送脚本
env:
SENDER_EMAIL: ${{ secrets.SENDER_EMAIL }}
SENDER_PASSWORD: ${{ secrets.SENDER_PASSWORD }}
RECEIVER_EMAIL: ${{ secrets.RECEIVER_EMAIL }}
SMTP_SERVER: ${{ secrets.SMTP_SERVER }}
SMTP_PORT: ${{ secrets.SMTP_PORT }}
run: python send_email.py

📷 操作截图

🔒 配置GitHub Secrets

📝 进入Secrets设置

按照以下路径进入Secrets设置页面:

进入GitHub仓库 → Settings → Secrets and variables → Actions

🔑 添加Secrets

点击 “New repository secret” 按钮,添加以下Secrets:

Secret名称描述示例
SENDER_EMAIL您的QQ邮箱地址3609506278@qq.com
SENDER_PASSWORD您的QQ邮箱授权码(不是密码)xxxxxxxxxxxxxxxx
RECEIVER_EMAIL收件人邮箱(可以和发件人相同)3609506278@qq.com
SMTP_SERVERSMTP服务器地址smtp.qq.com
SMTP_PORTSMTP服务器端口465

📷 操作截图

✅ 测试和验证

🚀 手动触发测试

按照以下步骤手动触发工作流测试:

进入GitHub仓库 → Actions → 每日科技新闻摘要 → Run workflow

点击 “Run workflow” 按钮手动触发工作流,无需等待定时执行

📊 查看运行结果

在Actions页面查看工作流的运行状态和详细日志:

  • 检查工作流是否成功启动
  • 查看每个步骤的执行状态
  • 检查是否成功发送邮件
  • 查看任何可能的错误信息

📷 操作截图

📧 验证邮件

查看您的QQ邮箱,确认是否收到了科技新闻摘要邮件:

  • 检查收件箱或邮件
  • 确认邮件主题是否为 “CCTV科技新闻摘要”
  • 查看邮件内容是否完整
  • 验证新闻链接是否可点击

📷 操作截图

📱 微信接收邮件提醒设置

为了确保及时收到科技新闻邮件,建议在微信里设置QQ邮箱提醒,只需按照以下步骤就能搞定:

📱 在微信里开启功能

  • 打开微信,点击右下角的「我」,进入「设置」
  • 选择「其他功能」(苹果跟安卓可能不同),然后点击进入「辅助功能」(部分旧版本可能显示为”功能”或”插件”)
  • 在列表中找到「QQ邮箱提醒」,点击后选择「启用该功能」绑定QQ号即可
  • 注意:如果找不到该入口,需先在微信的「我」-「设置」-「账号与安全」中绑定QQ号

📷 操作截图

🔐 QQ授权码变更注意事项

重要提醒:如果您修改了QQ密码,之前生成的QQ授权码将会失效,这会影响到使用该授权码的爬虫项目(如本项目)。遇到这种情况,请按照以下步骤操作:

🔑 重新生成QQ授权码

  • 登录QQ邮箱
  • 进入「设置」 > 「账户」
  • 找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」
  • 点击「生成授权码」,按照提示完成验证

💻 更新GitHub仓库中的授权码

  • 进入项目的GitHub仓库
  • 更新代码中的授权码:修改发送邮件的代码,将旧的授权码替换为新生成的授权码
  • 更新环境变量:进入「Settings」 > 「Actions」 > 「Secrets and variables」 > 「Variables」
  • 找到对应的环境变量,将其值更新为新的QQ授权码
  • 注意:环境变量的名称必须与自动化脚本(yml文件)中使用的变量名保持一致

❓ 常见问题排查

问题解决方案
邮件发送失败检查授权码是否正确,SMTP服务是否开启
新闻抓取失败检查网络连接,确认CCTV科技频道API是否可访问
GitHub Actions运行失败查看Actions日志,检查Secrets配置是否正确

🛠️ 项目维护

  • 🔍 定期检查:确保项目正常运行
  • 📦 更新依赖:定期更新Python依赖包
  • ⏰ 调整时间:根据需要修改GitHub Actions的运行时间
  • 🌟 扩展功能:根据需求添加更多新闻源或功能

🎯 技术难点与解决方案

🔍 JSONP数据解析

  • 问题:CCTV科技频道使用JSONP格式返回数据,直接解析困难。
  • 解决方案:使用正则表达式提取JSON数据,再进行解析。

📧 SMTP连接问题

  • 问题:不同邮箱服务商的SMTP设置不同,容易出现连接错误。
  • 解决方案:使用SMTP_SSL直接创建安全连接,简化连接流程。

⏰ 定时任务部署

  • 问题:需要服务器才能实现定时任务。
  • 解决方案:使用GitHub Actions免费实现自动化运行。

📝 结语

这个项目不仅是一个实用的工具,也是学习Python爬虫、邮件发送和自动化部署的好案例。通过它,你可以每天轻松获取最新的科技动态,同时也能提升自己的编程技能。

如果你对这个项目感兴趣,欢迎到我的GitHub仓库查看和Star,也可以在评论区分享你的使用体验和改进建议。
完整项目地址https://github.com/Jay-R-J/daily_news