如何在Django中借助Pythonanywhere实现每周定时发送邮件
解决方法
你当前的误区是把定时执行的脚本写成了Django视图函数,所以才会纠结入参和render返回值的问题,定时运行的脚本不需要作为视图对外提供访问,直接按独立可执行的Python脚本改造即可。
第一步:修改weekly_email_mm.py代码
import os import sys import datetime import django from django.core.mail import send_mail # 替换为你Pythonanywhere上的实际项目路径 sys.path.append('/home/你的Pythonanywhere账号名/你的项目根目录文件夹名') # 替换为你项目的settings路径,格式为「项目名.settings」 os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.settings') # 初始化Django环境,否则无法调用Django内置的邮件模块 django.setup() def send_mm_email(): # 时间判断逻辑放在函数内部,每次执行都会取最新的当前时间 today = datetime.date.today() weekday = today.weekday() subject = 'Hello' message = 'Hi there' if weekday == 4: send_mail( subject, message, 'something@from.com', ['user@xy.com'], fail_silently=False, ) print('Friday, mails sent') else: print('Not Friday') if __name__ == "__main__": send_mm_email()
第二步:本地测试脚本有效性
在Pythonanywhere的Web控制台进入项目目录,执行以下命令测试脚本是否正常运行:python weekly_email_mm.py
如果运行没有报错,输出Not Friday说明基础逻辑正常,你可以临时把判断条件weekday == 4改成对应当天的星期数值(周一为0,周日为6),测试能否正常收到邮件。
第三步:配置Pythonanywhere定时任务
进入Pythonanywhere后台的「Tasks」页面,添加每日定时任务,执行命令填写:python /home/你的Pythonanywhere账号名/你的项目根目录文件夹名/weekly_email_mm.py
再选择你希望发邮件的时间即可,平台每天到点会自动执行脚本,仅周五会触发邮件发送,其余日期仅输出日志不发信。
注意事项
- 确保你的Django项目
settings.py中已经配置了正确的邮件参数(包括EMAIL_HOST、EMAIL_PORT、EMAIL_HOST_USER、EMAIL_HOST_PASSWORD等),否则邮件发送会失败 - 测试阶段建议保留
fail_silently=False配置,出错时会输出具体报错信息方便排查 - 不要把时间获取逻辑放在函数外部,否则变量仅会在脚本首次加载时计算,不会自动更新时间
内容的提问来源于stack exchange,提问作者RlM
相关产品推荐
相关产品推荐

