Django实战项目-学习任务系统-发送邮件通知
接着上期代码内容,继续完善优化系统功能。
本次增加发送邮件通知功能,学习任务系统发布的任务,需要及时通知到学生用户知晓。
由于目前智能手机普及,人人都离不开手机,所以手机端接收通知信息更加及时有效。
其中微信使用频率最多,本来想使用微信通知功能,但是经过网上搜集资料测试发现无法使用。
因为微信网页版官网已经不支持了,所以不能使用 itchat 登录微信网页版发送消息,放弃该方案通知。
目前免费好用不限制字数的通知方法也就邮件通知了,手机安装好邮箱客户端APP,收到邮件的时候,手机也能及时弹框提醒消息。
还有手机短信通知更及时提醒,不过需要收费,这个后续再增加。
第一步:编写发送邮箱工具方法
因为常用QQ邮箱,所以示例使用QQ邮箱,其他邮箱也可使用。
注意,使用QQ邮箱或者其他邮箱发送,需要开通SMTP权限,具体怎么开通,自行了解。
1,编写邮箱工具
./mysite/study_system/mailutil.py
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText def send_mail_util(sender, password, receiver, email_host, subject, content):
'''
@方法名称: 发送邮件工具
@中文注释: 发送邮件工具
@入参:
@param sender str 发送邮箱
@param password str 发送邮箱密码
@param receiver str 接收邮箱
@param email_host str 邮件服务器
@param subject str 邮件主题
@param content str 邮件内容
@出参:
@返回状态:
@return 0 失败
@return 1 成功
@返回错误码
@返回错误信息
@param
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-11-02
@使用范例:
'''
try:
if (not type(sender) is str):
return [0, "FBC001", "发送邮箱参数类型错误,不为字符串", [None]]
if (not type(password) is str):
return [0, "FBC001", "发送邮箱密码参数类型错误,不为字符串", [None]]
if (not type(receiver) is str):
return [0, "FBC001", "接收邮箱参数类型错误,不为字符串", [None]]
if (not type(email_host) is str):
return [0, "FBC001", "邮件服务器参数类型错误,不为字符串", [None]]
if (not type(subject) is str):
return [0, "FBC001", "邮件主题参数类型错误,不为字符串", [None]]
if (not type(content) is str):
return [0, "FBC001", "邮件内容参数类型错误,不为字符串", [None]] # 你的收件邮箱地址列表
receivers = [receiver]
send_user = "<" + sender + ">"
print(send_user)
message = MIMEText(content, 'plain', 'utf-8')
message['Subject'] = subject
message['From'] = send_user
message['To'] = ";".join(receivers) server = smtplib.SMTP_SSL(email_host, 465)
server.login(sender, password)
server.sendmail(sender, receivers, message.as_string())
server.quit() print('邮件发送成功')
return [1, '000000', '邮件发送成功', [receivers[0]]] except Exception as e:
print("邮件发送失败异常," + str(e))
return [0, 'FBE999', "邮件发送失败异常," + str(e), [None]] # 主方法
if __name__ == '__main__':
sender = '12345678@qq.com'
# 通过QQ邮箱设置获取的授权码,不是邮箱密码
password = 'abcdefghijkmn'
receiver = '12345678@qq.com'
# 设置服务器:这个是qq邮箱服务器
email_host = "smtp.qq.com"
subject = '邮件主题'
content = '邮件内容'
# 发送邮件测试
send_mail_util(sender, password, receiver, email_host, subject, content)
2,测试效果
手机QQ邮箱接收邮件信息

第二步:邮件通知整合到发布任务功能中
1,编写QQ邮箱发送方法
./mysite/study_system/mailutil.py
def send_qq_mail(subject, content, receiver):
'''
@方法名称: 发送QQ邮件方法
@中文注释: 发送QQ邮件方法
@入参:
@param receiver str 接收邮箱
@param subject str 邮件主题
@param content str 邮件内容
@出参:
@返回状态:
@return 0 失败
@return 1 成功
@返回错误码
@返回错误信息
@param
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-11-02
@使用范例:
'''
try:
if (not type(receiver) is str):
return [0, "FBC001", "接收邮箱参数类型错误,不为字符串", [None]]
if (not type(subject) is str):
return [0, "FBC001", "邮件主题参数类型错误,不为字符串", [None]]
if (not type(content) is str):
return [0, "FBC001", "邮件内容参数类型错误,不为字符串", [None]] sender = '12345678@qq.com'
# 通过QQ邮箱设置获取的授权码,不是邮箱密码
password = 'abcdefghijkmn'
# 设置服务器:这个是qq邮箱服务器
email_host = "smtp.qq.com" # 你的收件邮箱地址列表
receivers = [receiver]
send_user = "<" + sender + ">"
print(send_user)
message = MIMEText(content, 'plain', 'utf-8')
message['Subject'] = subject
message['From'] = send_user
message['To'] = ";".join(receivers) server = smtplib.SMTP_SSL(email_host, 465)
server.login(sender, password)
server.sendmail(sender, receivers, message.as_string())
server.quit() print('邮件发送成功')
return [1, '000000', '邮件发送成功', [receivers[0]]] except Exception as e:
print("邮件发送失败异常," + str(e))
return [0, 'FBE999', "邮件发送失败异常," + str(e), [None]]
2,修改视图文件
./mysite/study_system/views.py
只举例修改一个发布新任务视图代码,其他定时任务发邮件通知类似。
def addNewTask(request):
'''
@方法名称: ajax请求, 表单视图,发布新任务
@作 者: PandaCode辉
@weixin公众号: PandaCode辉
@创建时间: 2023-10-10
'''
# 初始化响应容器
rsp_dict = {"result": "error", "errorMsg": "系统错误"}
# 是否ajax请求
if request.is_ajax():
try:
rest = request.POST
task_title = rest['taskTitle']
task_type = int(rest['taskType'])
task_description = rest['taskDescription']
reward_points = int(rest['rewardPoints'])
deadline_days = int(rest['deadlineDays'])
actual_days = 0
task_status = 0
# 获取当前用户名
username = request.session.get('username')
# 根据用户名获取用户对象
cur_user = StudyUser.objects.get(username=username)
print('根据用户名查询用户对象:' + str(cur_user))
# 创建者ID,使用 StudyUser 对象赋值
created_by = cur_user # 今天
# UTC格式当前时区时间
t = time.localtime()
work_date = time.strftime("%Y-%m-%d %H:%M:%S", t)
print('当前日期时间:' + str(work_date)) # 创建对象并保存到数据库
study_task = StudyTask(task_title=task_title, task_type=task_type, task_description=task_description,
reward_points=reward_points, deadline_days=deadline_days, task_status=task_status,
actual_days=actual_days, created_by=created_by, created_time=work_date,
update_time=work_date)
# 保存到数据库是否成功
study_task.save() receiver_mail = cur_user.email
# 发邮件通知
# 邮件主题
subject = '【学习系统新任务:' + task_title + '】'
# 邮件内容
content = ''
# 邮件内容换行符,'plain'纯文本格式邮件时候用\n或者\r字符串换行符
# HTML格式,使用<br>换行符
content += '【任务ID :' + str(study_task.task_id) + '】' + '\n'
content += '【发布时间 :' + work_date + '】' + '\n'
content += '【任务名称 :' + task_title + '】' + '\n'
# 任务类型
if task_type == 1:
# color : blue
content += '【任务类型 :1-系统任务】' + '\n'
elif task_type == 2:
content += '【任务类型 :2-辅导员任务】' + '\n' content += '【任务内容说明 :' + task_description + '】' + '\n'
content += '【计划完成天数 :' + str(deadline_days) + ' 天】' + '\n'
content += '【任务奖励 :' + str(reward_points) + '点】' + '\n'
content += '================================='
# 发送邮件通知
rstmail = mailutil.send_qq_mail(subject, content, receiver_mail) rsp_dict["result"] = "success"
except Exception as e:
rsp_dict["errorMsg"] = "发布新任务保存到数据库失败." # 成功与否都返回json数据格式
return JsonResponse(rsp_dict)
3,运行测试效果
3.1 页码发布新任务

3.2 发布完任务,手机接收到邮件通知信息

-------------------------------------------------end -------------------------------------------------
Django实战项目-学习任务系统-发送邮件通知的更多相关文章
- 01-Flutter移动电商实战-项目学习记录
一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...
- Node.js实战项目学习系列(1) 初识Node.js
前言 一直想好好学习node.js都是半途而废的状态,这次沉下心来,想好好的学习下node.js.打算写一个系列的文章大概10几篇文章,会一直以实际案例作为贯穿的学习. 什么是node Node.js ...
- SpringMVC+Mybatis+Mysql实战项目学习--环境搭建
1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...
- Node.js实战项目学习系列(2) 开发环境和调试工具
前言 上一节让我们对Node.js有一个初步的了解,那么现在可以开始正式学习下Node.js的开发了,但是任何一门语言要设计到开发,就必须先学习开发环境以及调试.本文将主要讲解这些内容. 本文涉及到的 ...
- Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)
前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...
- Node.js实战项目学习系列(5) node基础模块 path
前言 前面已经学习了很多跟Node相关的知识,譬如开发环境.CommonJs,那么从现在开始要正式学习node的基本模块了,开始node编程之旅了. path path 模块提供用于处理文件路径和目录 ...
- Django ---- blog项目学习所得
一.登录功能 1.采用ajax 提交form表单的方式 2.后台生成随机验证码,登录时提交验证码 3.用PLI库生成随机验证码,置于session中,登录时与前台提交的code进行upeer()的验证 ...
- Node.js实战项目学习系列(3) CommonJS 模块化规范
前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...
- Python Django CMDB项目实战之-1如何开启一个Django-并设置base页、index页、文章页面
1.环境 win10 python 2.7.14 django 1.8.2 需要用到的依赖包:MySQLdb(数据库的接口包).PIL/pillow(处理图片的包) 安装命令: pip install ...
- python3.6+selenium3.13 自动化测试项目实战一(增加自动发送邮件报告接口)
说明: 继实战项目一的基础上添加自动发送报告邮件接口,代码有部分调整,可以结合实战一和上篇文章学习 变动: 1.增加文本文档SendToUserinfo.txt 用来保存邮件接收者的信息 2.修改测试 ...
随机推荐
- Qt编写的项目作品5-物联网管理平台
一.功能特点 1 软件模块 设备监控模块,包括数据监控(表格形式展示).设备面板(面板形式展示).地图监控(地图形式展示).曲线监控(曲线形式展示). 数据查询模块,包括报警记录.运行记录.操作记录. ...
- 生产环境Sentinel改造实践(一):Sentinel核心概念
一.前言 本文主要是对sentinel-dashboard源码进行改造,用在生产环境保障其高可用,主要改造点如下: 接入nacos支持规则管理及推送 监控数据存入influxDb,后续可开发对应的监控 ...
- 在VS Code中vue引入新版vue-awesome-swiper编译时提示swiper/dist/css/swiper.css无法导入的问题
在安装vue-awesome-swiper时报错swiper/dist/css/swiper.min.css找不到,如下如: 有的回答安装6.0版本的话需要引入另外一个css import 'swip ...
- [转]关于java中JButton的样式设置(的一些我们应该知道的函数)
1. 对JButton大小的设置 --因为JButen是属于小器件类型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dim ...
- 《深入理解Mybatis原理》MyBatis初始化机制详解
主要构件及其相互关系 主要构件: 主要的核心部件解释如下: SqlSession: 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能 Executor:MyB ...
- Bogus:.NET的假数据生成利器
我们在项目开发中,为了保证系统功能完整.准确性,我们都需要模拟真实数据进行测试. 今天推荐一个开源库,方便我们制造假数据测试. 01 项目简介 Bogus 是一个开源的 .NET 库,它提供了一个强大 ...
- Solution -「ROI 2018」「LOJ #2850」无进位加法
\(\mathscr{Description}\) Link. 给定 \(\{a_n\}\),每次令某个 \(a_i\leftarrow a_i+1\),最终得到 \(\{b_n\}\),求 ...
- ConcurrentLinkedQueue深度源码剖析
在Java的并发包中,存在着许多高效的并发工具类,它优于synchronized关键字,在JDK中提供了一个ConcurrentLinkedQueue工具类实现了高效的并发读写工具类,该工具类具有很高 ...
- shell脚本中的变量
在shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业.如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次.突然你觉得 ...
- react 计算衍生数据
import React from 'react' import { connect } from 'react-redux' import TodoList from '../components/ ...