当前位置:首页>python>用Python写邮箱提醒事项的开源脚本

用Python写邮箱提醒事项的开源脚本

  • 2026-10-31 06:50:26
用Python写邮箱提醒事项的开源脚本
“

还记得年初那篇《2026年规划,我居然一次就搞定了?》吗?今天,我带着承诺中的完整版“周计划生成器”回来了!

如果你还没看过这个文章,或者已经对这里面的内容比较模糊了,建议先去看一下这篇文章哦 

2026年规划,我居然一次就搞定了?!

回顾:从“愿望清单”到“工程项目”

之前,我在文章中提到,我把年度规划当作一个软件项目来管理。当时很多读者留言说:

“

“这个工程化思维太棒了!但执行起来还是有点难……”

确实,规划最难的不是“制定”,而是“持续执行”。所以我做了一件很程序员的事情:

我把每周规划自动化了。

今天要分享的,就是这个从规划到执行的闭环系统——一个完全开源的Python脚本。

核心特性:

✅ 智能任务管理:支持循环任务、一次性任务、优先级标记✅ 自动时间规划:按类别智能分配,生成甘特图式时间线✅ 多端提醒:支持邮件、微信、手机推送✅ 数据持久化:所有任务JSON存储,历史可追溯✅ 完全开源:MIT协议,随意修改二次开发

技术栈解析

# 核心架构├── TaskManager          # 任务管理核心├── ReportGenerator      # 报告生成引擎  ├── NotificationService  # 多平台通知└── ConfigManager       # 配置管理系统

为什么选择Python?

  • •跨平台:Windows/Mac/Linux全支持
  • •生态丰富:邮件、API、定时任务一键集成
  • •易于扩展:你可以轻松添加新功能

实际使用效果

周一早晨的邮件提醒示例:

快速上手指南

1. 运行python项目

执行脚本截图

2. 基本配置

# 只需修改这个文件config.json:{  "email": "your@email.com",  "wechat_key": "你的Server酱KEY",  "planning_day": "Sunday",  "planning_time": "20:00"}

3. 添加你的第一个任务

python planner.py --add-task "学习Python" "学习成长" 2 "high"

4. 设置定时任务

# Linux/Maccrontab -e# 添加:0 20 * * 0 cd ~/weekly-planner && python planner.py

开箱即用的功能模板

脚本内置了6个维度的规划模板,直接使用:

# 健康生活维度示例health_tasks = [    {"name": "晨间运动", "hours": 0.5, "days": ["Mon", "Wed", "Fri"]},    {"name": "早睡打卡", "hours": 0.1, "days": "all"},    {"name": "健康饮食", "hours": 0.3, "days": "all"}]

完整的python实现代码

#!/usr/bin/env python3"""每周规划生成器用于自动生成下周的任务规划并发送提醒"""import jsonimport osfrom datetime import datetime, timedeltaimport smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom pathlib import Pathimport argparse# 配置文件路径CONFIG_FILE = "weekly_planner_config.json"TASKS_FILE = "tasks.json"TEMPLATE_FILE = "weekly_template.md"OUTPUT_DIR = "weekly_reports"class WeeklyPlanner:    def __init__(self):        self.config = self.load_config()        self.tasks = self.load_tasks()    def load_config(self):        """加载配置文件"""        default_config = {            "email": {                "enabled": False,                "smtp_server": "smtp.gmail.com",                "smtp_port": 587,                "username": "your_email@gmail.com",                "password": "your_password",                "sender": "your_email@gmail.com",                "receiver": "your_email@gmail.com"            },            "tasks_file": "tasks.json",            "output_dir": "weekly_reports",            "planning_day": "Sunday",  # 每周几生成规划            "planning_time": "20:00",  # 生成规划的时间            "categories": [                "学习成长",                "工作项目",                 "健康生活",                "人际关系",                "兴趣爱好"            ]        }        try:            with open(CONFIG_FILE, 'r', encoding='utf-8') as f:                config = json.load(f)                # 合并配置,确保所有必需字段都存在                for key in default_config:                    if key not in config:                        config[key] = default_config[key]                return config        except FileNotFoundError:            print(f"配置文件不存在,创建默认配置...")            # 保存默认配置            with open(CONFIG_FILE, 'w', encoding='utf-8') as f:                json.dump(default_config, f, ensure_ascii=False, indent=2)            return default_config    def load_tasks(self):        """加载任务数据"""        try:            with open(self.config["tasks_file"], 'r', encoding='utf-8') as f:                tasks = json.load(f)                return tasks        except FileNotFoundError:            print(f"任务文件不存在,创建示例任务文件...")            sample_tasks = self.create_sample_tasks()            self.save_tasks(sample_tasks)            return sample_tasks    def create_sample_tasks(self):        """创建示例任务"""        return {            "tasks": [                {                    "id": 1,                    "name": "AI模型训练项目",                    "category": "学习成长",                    "estimated_hours": 2,                    "priority": "high",                    "recurring": True,                    "recurring_days": ["Monday", "Wednesday", "Friday"],                    "status": "pending",                    "tags": ["AI", "Python", "机器学习"]                },                {                    "id": 2,                    "name": "技术博客写作",                    "category": "学习成长",                    "estimated_hours": 1.5,                    "priority": "medium",                    "recurring": True,                    "recurring_days": ["Saturday"],                    "status": "pending",                    "tags": ["写作", "技术分享"]                },                {                    "id": 3,                    "name": "健身房锻炼",                    "category": "健康生活",                    "estimated_hours": 1,                    "priority": "high",                    "recurring": True,                    "recurring_days": ["Monday", "Wednesday", "Friday"],                    "status": "pending",                    "tags": ["健身", "健康"]                }            ]        }    def save_tasks(self, tasks):        """保存任务数据"""        with open(self.config["tasks_file"], 'w', encoding='utf-8') as f:            json.dump(tasks, f, ensure_ascii=False, indent=2)    def get_next_week_tasks(self):        """获取下周的任务"""        today = datetime.now()        next_monday = today + timedelta(days=(7 - today.weekday()))        next_sunday = next_monday + timedelta(days=6)        week_tasks = []        for task in self.tasks["tasks"]:            if task.get("recurring", False):                # 检查是否是循环任务                recurring_days = task.get("recurring_days", [])                for day in recurring_days:                    task_copy = task.copy()                    task_copy["scheduled_day"] = day                    week_tasks.append(task_copy)            elif task.get("status") == "pending":                # 一次性任务                week_tasks.append(task)        return week_tasks, next_monday, next_sunday    def generate_weekly_report(self):        """生成每周规划报告"""        week_tasks, next_monday, next_sunday = self.get_next_week_tasks()        # 按类别分组任务        tasks_by_category = {}        for category in self.config["categories"]:            tasks_by_category[category] = []        for task in week_tasks:            category = task.get("category", "其他")            if category not in tasks_by_category:                tasks_by_category[category] = []            tasks_by_category[category].append(task)        # 计算总时间        total_hours = sum(task.get("estimated_hours", 0) for task in week_tasks)        # 读取模板或使用默认模板        try:            with open(TEMPLATE_FILE, 'r', encoding='utf-8') as f:                template = f.read()        except FileNotFoundError:            template = """# 下周核心任务 ({start_date} - {end_date})## 📊 概览- 总任务数: {task_count} 个- 预计总耗时: {total_hours} 小时- 平均每日: {daily_hours:.1f} 小时{categories_content}## 🎯 重点关注{high_priority_content}## 💡 温馨提示1. 建议每天开始前查看当日任务2. 遇到困难时及时调整,保持灵活性3. 每周日进行复盘,优化下周计划行动,只有行动才能决定价值! 🚀"""        # 生成按类别分类的内容        categories_content = ""        for category, tasks in tasks_by_category.items():            if tasks:                categories_content += f"\n### {category}\n"                for task in tasks:                    emoji = "🔴" if task.get("priority") == "high" else "🟡" if task.get("priority") == "medium" else "🟢"                    scheduled_day = task.get("scheduled_day", "未指定")                    hours = task.get("estimated_hours", 0)                    tags = " ".join([f"`{tag}`" for tag in task.get("tags", [])])                    categories_content += f"- {emoji} **{task['name']}** ({scheduled_day}, 预计{hours}小时) {tags}\n"        # 生成高优先级任务内容        high_priority_tasks = [t for t in week_tasks if t.get("priority") == "high"]        high_priority_content = ""        if high_priority_tasks:            high_priority_content = "本周有以下高优先级任务需要重点关注:\n"            for task in high_priority_tasks:                scheduled_day = task.get("scheduled_day", "尽快完成")                high_priority_content += f"- **{task['name']}** (安排于: {scheduled_day})\n"        else:            high_priority_content = "本周没有高优先级任务,可以按部就班完成常规任务。"        # 格式化日期        start_date_str = next_monday.strftime("%Y年%m月%d日")        end_date_str = next_sunday.strftime("%Y年%m月%d日")        # 渲染报告        daily_hours = total_hours / 7 if len(week_tasks) > 0 else 0        report = template.format(            start_date=start_date_str,            end_date=end_date_str,            task_count=len(week_tasks),            total_hours=total_hours,            daily_hours=daily_hours,            categories_content=categories_content,            high_priority_content=high_priority_content        )        return report, next_monday    def save_report_to_file(self, report, date):        """保存报告到文件"""        # 创建输出目录        Path(self.config["output_dir"]).mkdir(exist_ok=True)        # 生成文件名        filename = f"weekly_plan_{date.strftime('%Y%m%d')}.md"        filepath = os.path.join(self.config["output_dir"], filename)        with open(filepath, 'w', encoding='utf-8') as f:            f.write(report)        print(f"✓ 报告已保存到: {filepath}")        return filepath    def send_email_qq(self, report, date):        """QQ邮箱专用发送函数"""        try:            email_config = self.config["email"]            subject = f"下周规划提醒 ({date.strftime('%Y-%m-%d')})"            msg = MIMEText(report, 'plain', 'utf-8')            msg['Subject'] = Header(subject, 'utf-8')            msg['From'] = email_config["sender"]            msg['To'] = email_config["receiver"]            if email_config.get("use_ssl", True):                server = smtplib.SMTP_SSL(email_config["smtp_server"], email_config["smtp_port"])            else:                server = smtplib.SMTP(email_config["smtp_server"], email_config["smtp_port"])                server.starttls()            server.login(email_config["username"], email_config["password"])            server.sendmail(email_config["sender"], [email_config["receiver"]], msg.as_string())            server.quit()            print("✓ QQ邮箱邮件发送成功!")            return True        except Exception as e:            print(f"✗ QQ邮箱发送失败: {e}")            return False    def add_task(self, name, category, hours, priority="medium", recurring=False, recurring_days=None, tags=None):        """添加新任务"""        if recurring_days is None:            recurring_days = []        if tags is None:            tags = []        # 生成新任务ID        new_id = max([task["id"] for task in self.tasks["tasks"]]) + 1 if self.tasks["tasks"] else 1        new_task = {            "id": new_id,            "name": name,            "category": category,            "estimated_hours": hours,            "priority": priority,            "recurring": recurring,            "recurring_days": recurring_days,            "status": "pending",            "tags": tags,            "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")        }        self.tasks["tasks"].append(new_task)        self.save_tasks(self.tasks)        print(f"✓ 任务 '{name}' 添加成功!")        return new_id    def run(self, send_email=False):        """运行规划生成器"""        print("=" * 50)        print("每周规划生成器")        print("=" * 50)        # 生成报告        report, next_monday = self.generate_weekly_report()        print(report)        # 保存到文件        report_file = self.save_report_to_file(report, next_monday)        # 发送邮件        if send_email:            self.send_email_qq(report, next_monday)        print("✓ 下周规划生成完成!")        return report_filedef main():    parser = argparse.ArgumentParser(description="每周规划生成器")    parser.add_argument("--email", action="store_true", help="发送邮件提醒")    parser.add_argument("--add-task", nargs='+', help="添加新任务: 名称 类别 小时数 [优先级]")    parser.add_argument("--list-tasks", action="store_true", help="列出所有任务")    parser.add_argument("--init", action="store_true", help="初始化配置文件")    args = parser.parse_args()    planner = WeeklyPlanner()    if args.init:        print("初始化完成!")        print(f"配置文件: {CONFIG_FILE}")        print(f"示例任务文件: {TASKS_FILE}")        return    if args.add_task:        # 添加新任务        if len(args.add_task) < 3:            print("请提供任务名称、类别和预计小时数")            return        name = args.add_task[0]        category = args.add_task[1]        hours = float(args.add_task[2])        priority = args.add_task[3] if len(args.add_task) > 3 else "medium"        planner.add_task(name, category, hours, priority)    elif args.list_tasks:        # 列出所有任务        print("当前所有任务:")        print("-" * 50)        for task in planner.tasks["tasks"]:            status = "🔁" if task.get("recurring") else "✅" if task.get("status") == "completed" else "📝"            print(f"{status} [{task['id']}] {task['name']} ({task['category']}, {task['estimated_hours']}h)")    else:        # 生成每周规划        planner.run(send_email=args.email)if __name__ == "__main__":    main()

我的使用心得

使用这个系统一周后,我发现了几个关键点:

1. 原子化是王道

“

任务拆得越细,执行率越高。我坚持“2小时原则”:所有任务都拆到2小时内能完成。

2. 系统 > 意志力

“

不要依赖“我一定能完成”的决心,而是设计“不完成都难”的系统。

3. 复盘创造复利

“

每周的复盘Markdown文件,现在成了我最好的成长日记。

4. 灵活调整是智慧

“

系统支持动态调整,遇到突发情况随时改,不会因为一次错过而全盘放弃。

真实数据反馈

自使用该系统以来:

  • •任务完成率:从 ~20% → 85%+
  • •时间感知度:从模糊 → 精准到小时
  • •周末焦虑感:大幅降低(因为知道每天做了什么)

进阶玩法

1. 集成日历API

# 自动同步Google Calendardef sync_with_calendar():    # 你的代码...

2. 数据可视化

# 用Matplotlib生成执行报告import matplotlib.pyplot as pltplt.plot(week_numbers, completion_rates)

3. AI优化建议

# 结合GPT API给出优化建议def get_ai_suggestion(tasks):    # 调用OpenAI API    pass

开源共建

如果你觉得这里的代码格式乱了,或者不是特别清楚是如何运行的,建议从下面的地址看详细的使用说明并复制代码: 

https://www.yuque.com/hl1012/lrxex9/kkd5xhkhhk25o5gk?singleDoc# 《规划生成器》

下一步计划

基于读者的反馈,我计划:

  1. Web界面版:不需要命令行,打开网页就能用
  2. 移动端App:随时查看和调整计划
  3. 团队协作版:和团队、家人共享计划
  4. AI智能分配:让AI帮你优化时间安排
  5. 社交媒体内容排期(微博、公众号、小红书),定时发布到各平台
  6. 家庭事务管理助手:家人生日/纪念日提醒
  7. 项目管理里程碑跟踪:项目关键节点自动提醒,依赖任务完成状态同步,风险预警(延期风险、资源冲突)
  8. 接入其他平台:例如微信,企业微信等

总结

技术改变生活,不是空话。

一个小小的Python脚本,就能把我们从“计划-放弃”的循环中解救出来。它不会让你突然变得自律,但它给了你一个可操作的系统。

在这个系统里:

  • •目标不再遥不可及
  • •时间变得清晰可见
  • •成长有迹可循

2026年已过去一周,你的年度计划执行得如何了?如果还在寻找坚持的方法,不妨试试这个脚本。

最后,用程序员的方式祝福:

def wish_you_2026():    plans = load_your_plans()    execute_with_consistency(plans)    achievements = review_at_year_end()    if achievements > expectations:        print("🎉 2026,你超额完成了!")    else:        print("✨ 至少,你一直在前进的路上。")    return True

规划的意义,不在于完美执行,而在于让我们在不确定的世界里,多一份确定的勇气。

如果对这个系列感兴趣,请留言,后续会基于这个,把我设想的下一步计划和进阶玩法都与大家进行分享~,让这个26年的计划不再孤单的躺在计划表里。

最新文章

随机文章