You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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为例,步骤如下:

  1. 创建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("定时邮件发送成功!"))
  1. 配置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来做定时任务是最契合的方案。

  1. 安装依赖:
pip install celery django-celery-beat
  1. settings.py里添加app:
INSTALLED_APPS = [
    # ... 其他app
    'django_celery_beat',
]
  1. 创建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)
  1. 运行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

火山引擎 最新活动