如何使用Python实现每日上午11点定时发送邮件?
Hey there! 既然你已经搞定了邮件发送的核心代码,定时触发这块其实有几个实用的方案,我给你拆解下,按需选择就行:
方案1:用轻量的schedule库(适合简单脚本场景)
如果你只是需要一个简单的定时脚本跑起来,schedule库足够好用,语法也很直观。
首先安装库:
pip install schedule
然后写一个定时脚本(比如daily_email.py),注意要先初始化Django环境,不然没法调用Django的邮件模块:
import schedule import time import os import django # 替换成你的Django项目配置路径 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings') django.setup() # 导入你的邮件发送函数(注意调整路径,比如如果是app的views里的类方法,要先实例化类再调用) from your_app_name.views import send_email def daily_email_job(): # 这里传入你需要的subject、message、收件人列表 # 如果send_email是类方法,记得先实例化类,比如 YourClass().send_email(...) send_email(subject="每日定时提醒", message="这是今天的定时邮件内容", email_to=["user@example.com"]) # 设置每天上午11点执行任务 schedule.every().day.at("11:00").do(daily_email_job) # 保持脚本运行,每分钟检查一次任务 while True: schedule.run_pending() time.sleep(60)
运行脚本后,它就会在每天11点自动触发邮件发送啦~ 要是想让脚本后台运行,可以用nohup python daily_email.py &或者用supervisor托管。
方案2:功能更强的APScheduler(适合复杂定时需求)
如果你的定时需求更灵活(比如要支持时区、重复规则调整等),APScheduler是更好的选择,它支持多种触发器类型。
先安装库:
pip install apscheduler
同样写脚本初始化Django环境并配置定时:
from apscheduler.schedulers.blocking import BlockingScheduler import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings') django.setup() from your_app_name.views import send_email def daily_email_job(): send_email(subject="每日定时提醒", message="这是今天的定时邮件内容", email_to=["user@example.com"]) # 初始化调度器,记得设置你的时区 scheduler = BlockingScheduler(timezone="Asia/Shanghai") # 添加每天11点执行的任务,用cron触发器 scheduler.add_job(daily_email_job, 'cron', hour=11) try: scheduler.start() except (KeyboardInterrupt, SystemExit): # 停止调度器 scheduler.shutdown()
方案3:系统级定时任务(推荐生产环境使用)
如果是生产环境,我更推荐用系统自带的定时任务工具,比如Linux的cron或者Windows的任务计划程序,稳定性更高,不用额外维护一个Python脚本进程。
以Linux为例,步骤如下:
- 创建Django自定义命令:在你的app目录下新建
management/commands/send_daily_email.py(如果没有management和commands文件夹,先创建,记得每个文件夹都要有__init__.py):
from django.core.management.base import BaseCommand from django.core.mail import EmailMessage class Command(BaseCommand): help = "每日11点发送定时邮件" def handle(self, *args, **options): subject = "每日定时提醒" message = "这是今天的定时邮件内容" email_to = ["user@example.com"] email = EmailMessage(subject, message, None, email_to) email.send(fail_silently=False) self.stdout.write(self.style.SUCCESS("定时邮件发送成功!"))
- 配置cron任务:
打开cron编辑界面:
crontab -e
添加一行定时规则,替换成你的虚拟环境路径和项目路径:
0 11 * * * /path/to/your/virtualenv/bin/python /path/to/your/project/manage.py send_daily_email
这条规则的意思是每天11点0分执行这个Django命令,发送邮件。
方案4:Celery + Celery Beat(适合已有异步任务架构的Django项目)
如果你的Django项目已经在使用Celery处理异步任务,那直接用Celery Beat来做定时任务是最契合的方案。
- 安装依赖:
pip install celery django-celery-beat
- 在
settings.py里添加app:
INSTALLED_APPS = [ # ... 其他app 'django_celery_beat', ]
- 创建tasks.py(在你的app目录下):
from celery import shared_task from django.core.mail import EmailMessage @shared_task def send_daily_email(): subject = "每日定时提醒" message = "这是今天的定时邮件内容" email_to = ["user@example.com"] email = EmailMessage(subject, message, None, email_to) email.send(fail_silently=False)
- 运行Celery Beat:
celery -A your_project_name beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
之后你可以通过Django admin界面,找到Periodic Tasks,新建一个定时任务,设置每天11点执行send_daily_email任务即可。
内容的提问来源于stack exchange,提问作者rinrin0000




