栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

「Django 功能开发」定时任务 & 邮件发送(含各种附件)功能

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

「Django 功能开发」定时任务 & 邮件发送(含各种附件)功能

文章目录
  • 内容介绍
  • settings.py 邮箱配置
  • 定时任务配置
  • 定时任务邮件功能
  • 发送附件拓展

内容介绍

文本初衷是为了实现在 Django 项目中设置定时任务,通过定时任务备份数据并发送到指定的邮箱中。

先来看一下最终的效果

settings.py 邮箱配置
# 发送邮件的setting设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.qq.com"
EMAIL_PORT = 25
EMAIL_HOST_USER = "你的QQ邮箱"
EMAIL_HOST_PASSWORD = "你的密码" # 不是邮箱登录密码,是代理服务密码
EMAIL_USE_TLS = True
EMAIL_FROM = EMAIL_HOST_USER
定时任务配置

此方法不适合 Window 环境!Window 环境!Window 环境!

在 Django 执行定时任务,可以通过 django-crontab 扩展来实现。

# 安装
pip install django-crontab

settings.py 中配置 crontab

INSTALLED_APPS = [
    ...
    'django_crontab',  # 定时任务
    ...
]

定时任务基本格式

基本格式 :
 
* * * * *

分 时 日 月 周      命令
M: 分钟(0-59)。每分钟用*或者 */1表示
H:小时(0-23)。(0表示0点)
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。

settings.py 中添加定时任务和输出日志

# 定时任务 每天只执行一次
# timed_task是指定的任务py文件
CRonJOBS = [
    ('0 0 1 * *', 'apps.Configuration.timed_task.backups_blog',
     '>> /Django/MyHome/backups_data/logs/crontab.log'),
]

开启定时任务

添加定时任务到系统中,每次修改settings.py的定时任务都需要重新添加

python manage.py crontab add

显示已经激活的定时任务

python manage.py crontab show

移除定时任务

python manage.py crontab remove
定时任务邮件功能

创建定时任务执行文件 timed_task.py

# coding:utf-8
__author__ = 'Mr.数据杨'
__explain__ = '定时任务'

# 每日定时备份blog的内容发送文件到 QQ邮箱
# 此方式仅限Linux执行

from apps.Blog.models import *
import pandas as pd
from MyHome.settings import *
import datetime
from django.core.mail import send_mail, EmailMultiAlternatives
from email.header import make_header
from email.mime.text import MIMEText  # html格式和文本格式邮件
from email.mime.image import MIMEImage  # 带图片格式邮件
import os


# 备份文件
def backups_blog():
    # 读取文章的基本内信息
    df = pd.Dataframe(list(ArticleInfo.objects.all().values()))
    # 读取item的外键关联数据
    df_dict = pd.Dataframe(list(ArticleItem.objects.all().values()))
    df_dict = dict(zip(df_dict['id'], df_dict['item_name']))
    df["article_item_id"] = df["article_item_id"].map(df_dict)
    df.to_excel(base_DIR + "/backups_data/blog_info.xlsx")

    df = pd.Dataframe(list(ShortVideoBlog.objects.all().values()))
    df.to_excel(base_DIR + "/backups_data/blog_video_info.xlsx")

    # 当天日期
    today = datetime.date.today()

    subject = str(today) + ' 文章和视频内容备份'
    text_content = str(today) + "备份信息"
    html_content = '{}备份文件'.format(str(today))
    from_email = EMAIL_HOST_USER
    receive_email_addr = [EMAIL_HOST_USER]
    msg = EmailMultiAlternatives(subject, text_content, from_email, receive_email_addr)
    msg.attach_alternative(html_content, "text/html")

    # 添加附件
    file_path = os.path.join(base_DIR + "/backups_data/blog_info.xlsx")
    text = open(file_path, 'rb').read()
    file_name = os.path.basename(file_path)
    b = make_header([(file_name, 'utf-8')]).encode('utf-8')
    msg.attach(b, text)

    file_path = os.path.join(base_DIR + "/backups_data/blog_video_info.xlsx")
    text = open(file_path, 'rb').read()
    file_name = os.path.basename(file_path)
    b = make_header([(file_name, 'utf-8')]).encode('utf-8')
    msg.attach(b, text)
    msg.send()
发送附件拓展

可以发送文档、图片等内容汇总

    # 发送图像
    html1 = ""
    msg_html_img = MIMEText(html1, 'html', 'utf-8')
    msg.attach(msg_html_img)
    file_path = os.path.join(settings.base_DIR, "static/kd.png")
    with open(file_path, "rb") as f:
        msg_img = MIMEImage(f.read())
    msg_img.add_header('Content-ID', 'imgid')  # 扩展图片标题
    msg.attach(msg_img)
 
    # 发送附件
    print('********************发送附件txt********************')
    file_path = os.path.join(settings.base_DIR, "日志.txt")
    text = open(file_path, 'rb').read()
    file_name = os.path.basename(file_path)
    # 对文件进行编码处理
    b = make_header([(file_name, 'utf-8')]).encode('utf-8')
    msg.attach(b, text)
 
    print('********************发送附件jpg********************')
    file_path = os.path.join(settings.base_DIR, "test.jpg")
    text = open(file_path, 'rb').read()
    file_name = os.path.basename(file_path)
    # 对文件进行编码处理
    b = make_header([(file_name, 'utf-8')]).encode('utf-8')
    msg.attach(b, text)
 
    print('********************发送附件xlsx********************')
    file_path = os.path.join(settings.base_DIR, "test.xlsx")
    text = open(file_path, 'rb').read()
    file_name = os.path.basename(file_path)
    # 对文件进行编码处理
    b = make_header([(file_name, 'utf-8')]).encode('utf-8')
    msg.attach(b, text)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号