在日常信息获取场景中,很多资讯、博客都会提供RSS订阅源,手动定期查看更新十分繁琐。通过Python脚本可以自动监控RSS源的更新情况,一旦有新内容发布就自动发送邮件通知,大幅提升信息获取效率。

所需依赖库说明
实现这个功能需要用到两个核心Python库,分别是feedparser和smtplib,前者用于解析RSS内容,后者用于发送邮件,另外还需要time和json库辅助实现状态存储和定时循环。
- feedparser:专门用于解析RSS、Atom等格式的订阅源,能快速提取标题、链接、发布时间等内容
- smtplib:Python内置的SMTP协议客户端库,无需额外安装,可直接调用发送邮件
- time:用于设置脚本的定时轮询间隔
- json:用于将已推送的RSS条目ID存储到本地文件,避免重复通知
环境准备
首先确保Python版本在3.6及以上,然后安装feedparser库,执行以下命令即可:
pip install feedparser
完整实现代码
以下是完整的监控脚本,代码中包含详细注释说明每个部分的作用:
import feedparser
import smtplib
import time
import json
import os
from email.mime.text import MIMEText
from email.header import Header
# 配置参数
RSS_URL = "https://ipipp.com/rss" # 替换为你的RSS订阅源地址
CHECK_INTERVAL = 3600 # 检查间隔,单位秒,这里设置为1小时
STATE_FILE = "rss_state.json" # 存储已推送条目ID的文件
SMTP_CONFIG = {
"host": "smtp.163.com", # 替换为你的SMTP服务器地址
"port": 465,
"user": "your_email@163.com", # 替换为发件邮箱
"password": "your_auth_code", # 替换为邮箱授权码,不是登录密码
"receiver": "target_email@ipipp.com" # 替换为收件邮箱
}
def load_state():
# 加载已推送的条目ID,避免重复通知
if os.path.exists(STATE_FILE):
with open(STATE_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {"pushed_ids": []}
def save_state(state):
# 保存已推送的条目ID到本地文件
with open(STATE_FILE, "w", encoding="utf-8") as f:
json.dump(state, f, ensure_ascii=False, indent=2)
def send_email(title, link, content):
# 发送邮件通知
mail_content = f"""
检测到RSS新更新:
标题:{title}
链接:{link}
内容摘要:{content[:200]}
"""
msg = MIMEText(mail_content, "plain", "utf-8")
msg["From"] = Header(SMTP_CONFIG["user"])
msg["To"] = Header(SMTP_CONFIG["receiver"])
msg["Subject"] = Header("RSS更新通知", "utf-8")
try:
# 使用SSL方式连接SMTP服务器
server = smtplib.SMTP_SSL(SMTP_CONFIG["host"], SMTP_CONFIG["port"])
server.login(SMTP_CONFIG["user"], SMTP_CONFIG["password"])
server.sendmail(SMTP_CONFIG["user"], [SMTP_CONFIG["receiver"]], msg.as_string())
server.quit()
print(f"邮件发送成功,标题:{title}")
return True
except Exception as e:
print(f"邮件发送失败:{e}")
return False
def main():
state = load_state()
pushed_ids = state["pushed_ids"]
while True:
print("开始检查RSS更新...")
feed = feedparser.parse(RSS_URL)
if feed.bozo:
print(f"RSS解析异常:{feed.bozo_exception}")
else:
for entry in feed.entries:
# 用条目的ID作为唯一标识,如果没有ID就用链接作为标识
entry_id = entry.get("id", entry.link)
if entry_id not in pushed_ids:
# 新条目,发送通知
send_result = send_email(
entry.title,
entry.link,
entry.get("summary", "无内容摘要")
)
if send_result:
pushed_ids.append(entry_id)
save_state({"pushed_ids": pushed_ids})
print(f"本次检查完成,等待{CHECK_INTERVAL}秒后进行下一次检查")
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
main()
配置说明
运行脚本前需要修改代码中的配置参数:
- 将
RSS_URL替换为你需要监控的RSS订阅源地址 - 根据使用的邮箱服务商修改
SMTP_CONFIG中的服务器地址和端口,比如QQ邮箱的SMTP服务器是smtp.qq.com,端口465 - 填写发件邮箱、邮箱授权码和收件邮箱,注意邮箱授权码需要在邮箱设置中单独开启SMTP服务获取,不是邮箱登录密码
- 可以根据需要调整
CHECK_INTERVAL的值,修改检查间隔
运行与注意事项
配置完成后直接运行脚本即可,脚本会持续在后台运行,每隔设定的时间检查一次RSS更新。如果需要脚本在服务器上长期运行,可以使用nohup命令或者systemd服务来管理进程。
需要注意如果RSS源的条目没有唯一ID,代码中会自动使用链接作为标识,这种情况下如果同一条目链接被修改,可能会被判定为新条目重复通知。另外如果RSS源更新频率很高,可以适当缩短检查间隔,但建议不要设置太短,避免给RSS源服务器造成压力。
PythonRSS监控邮件发送feedparsersmtplib修改时间:2026-07-13 00:06:30