RSS作为常用的内容聚合格式,很多用户希望通过邮件及时接收订阅源的更新内容,避免错过重要信息。实现RSS集成邮件通知的核心思路是定期抓取RSS内容,解析最新更新的条目,再通过邮件服务将内容推送给指定收件人。
环境准备
实现该功能需要准备以下环境和依赖:
- Python 3.6及以上版本
- feedparser库:用于解析RSS内容,可通过
pip install feedparser安装 - smtplib库:Python内置的邮件发送库,无需额外安装
- 一个可开启SMTP服务的邮箱,比如QQ邮箱、163邮箱等
核心实现步骤
1. 解析RSS内容
首先使用feedparser库读取RSS链接,获取最新的条目信息,我们可以提取标题、链接、发布时间等核心字段。
import feedparser
def parse_rss(rss_url):
# 解析RSS链接
feed = feedparser.parse(rss_url)
entries = []
# 遍历所有条目,提取需要的信息
for entry in feed.entries:
item = {
"title": entry.get("title", "无标题"),
"link": entry.get("link", ""),
"published": entry.get("published", "未知发布时间")
}
entries.append(item)
return entries
# 示例RSS链接,可替换为自己的订阅源
rss_url = "https://rsshub.app/zhihu/daily"
latest_entries = parse_rss(rss_url)
print(f"获取到{len(latest_entries)}条最新内容")
2. 编写邮件发送逻辑
使用smtplib和email库构造邮件内容,将解析到的RSS条目整理成邮件正文,发送到指定邮箱。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email(sender, password, receiver, subject, content, smtp_server, smtp_port):
# 构造邮件内容
message = MIMEText(content, "html", "utf-8")
message["From"] = Header(sender, "utf-8")
message["To"] = Header(receiver, "utf-8")
message["Subject"] = Header(subject, "utf-8")
try:
# 连接SMTP服务器并发送邮件
smtp_obj = smtplib.SMTP_SSL(smtp_server, smtp_port)
smtp_obj.login(sender, password)
smtp_obj.sendmail(sender, [receiver], message.as_string())
smtp_obj.quit()
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败:{e}")
# 邮箱配置示例,替换为自己的实际信息
sender_email = "test@ipipp.com"
sender_password = "邮箱SMTP授权码"
receiver_email = "receive@ipipp.com"
smtp_server = "smtp.ipipp.com"
smtp_port = 465
3. 整合逻辑并添加去重机制
为了避免重复发送已经推送过的内容,我们需要记录已发送的条目链接,每次只推送新的内容。
import json
import os
# 存储已发送条目的文件路径
SENT_RECORD_FILE = "sent_entries.json"
def load_sent_records():
# 加载已发送的条目链接
if os.path.exists(SENT_RECORD_FILE):
with open(SENT_RECORD_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return []
def save_sent_records(records):
# 保存已发送的条目链接
with open(SENT_RECORD_FILE, "w", encoding="utf-8") as f:
json.dump(records, f, ensure_ascii=False, indent=2)
def generate_email_content(entries):
# 生成HTML格式的邮件正文
html = "<h2>RSS最新更新内容</h2>"
html += "<ul>"
for entry in entries:
html += f"<li><a href='{entry['link']}'>{entry['title']}</a><br/>发布时间:{entry['published']}</li>"
html += "</ul>"
return html
def main():
rss_url = "https://rsshub.app/zhihu/daily"
# 解析RSS内容
entries = parse_rss(rss_url)
# 加载已发送记录
sent_links = load_sent_records()
# 筛选未发送的新条目
new_entries = [e for e in entries if e["link"] not in sent_links]
if not new_entries:
print("没有新的RSS内容需要推送")
return
# 生成邮件内容
email_content = generate_email_content(new_entries)
# 发送邮件
send_email(
sender_email,
sender_password,
receiver_email,
"RSS订阅更新通知",
email_content,
smtp_server,
smtp_port
)
# 更新已发送记录
new_links = [e["link"] for e in new_entries]
save_sent_records(sent_links + new_links)
if __name__ == "__main__":
main()
设置定时任务
实现自动推送需要设置定时任务,在Linux系统下可以使用crontab,Windows系统下可以使用任务计划程序。以crontab为例,编辑定时任务:
# 打开crontab编辑界面 crontab -e # 添加以下内容,每小时执行一次脚本,替换为实际脚本路径 0 * * * * /usr/bin/python3 /path/to/your/rss_mail.py >> /tmp/rss_mail.log 2>&1
注意事项
- 邮箱SMTP授权码不是邮箱登录密码,需要在邮箱设置中单独开启SMTP服务获取
- 不同邮箱的SMTP服务器地址和端口不同,需要参考对应邮箱的官方说明配置
- 如果RSS条目较多,可以适当调整筛选逻辑,只推送最近一段时间内的更新内容
- 定时任务的执行频率可以根据订阅源的更新频率调整,避免过于频繁请求RSS源
RSS邮件通知Pythonfeedparser修改时间:2026-06-26 22:03:46