- 内容介绍
- settings.py 邮箱配置
- 定时任务配置
- 定时任务邮件功能
- 发送附件拓展
文本初衷是为了实现在 Django 项目中设置定时任务,通过定时任务备份数据并发送到指定的邮箱中。
先来看一下最终的效果
# 发送邮件的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)



