Django实战项目-学习任务系统-发送邮件通知

接着上期代码内容,继续完善优化系统功能。

本次增加发送邮件通知功能,学习任务系统发布的任务,需要及时通知到学生用户知晓。

由于目前智能手机普及,人人都离不开手机,所以手机端接收通知信息更加及时有效。

其中微信使用频率最多,本来想使用微信通知功能,但是经过网上搜集资料测试发现无法使用。

因为微信网页版官网已经不支持了,所以不能使用 itchat 登录微信网页版发送消息,放弃该方案通知。

目前免费好用不限制字数的通知方法也就邮件通知了,手机安装好邮箱客户端APP,收到邮件的时候,手机也能及时弹框提醒消息。

还有手机短信通知更及时提醒,不过需要收费,这个后续再增加。

第一步:编写发送邮箱工具方法

因为常用QQ邮箱,所以示例使用QQ邮箱,其他邮箱也可使用。

注意,使用QQ邮箱或者其他邮箱发送,需要开通SMTP权限,具体怎么开通,自行了解。

1,编写邮箱工具

./mysite/study_system/mailutil.py

# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMETextdef 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'] = subjectmessage['From'] = send_usermessage['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'] = subjectmessage['From'] = send_usermessage['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.POSTtask_title = rest['taskTitle']task_type = int(rest['taskType'])task_description = rest['taskDescription']reward_points = int(rest['rewardPoints'])deadline_days = int(rest['deadlineDays'])actual_days = 0task_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 : bluecontent += '【任务类型 :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 -------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

superagent 库

superagent 是一个流行的 JavaScript 库&#xff0c;用于在浏览器和 Node.js 环境中进行 HTTP 请求。它提供了简洁的 API&#xff0c;使得发送异步请求变得非常容易。 以下是一个使用 superagent 的简单示例&#xff1a; 在浏览器环境中&#xff1a; // 发送 GET 请求 supe…

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN&#xff0c;对图片进行分类并使用图片进行测试模型-适合入门&#xff0c;从模型到训练再到测试&#xff1a;开源项目 开源项目完整代码及基础教程&#xff1a; https://mbd.pub/o/bread/ZZWclp5x CNN模型&#xff1a; 1.导入必要的库和模块&…

PP-Matting:trimap free的高精度自然图像抠图

论文&#xff1a;https://arxiv.org/abs/2204.09433 代码&#xff1a;https://github.com/PaddlePaddle/PaddleSeg 1、动机 在自然图像抠图领域&#xff0c;大多数方法都是基于Trimap来做抠图&#xff0c;这种trimap-based的方式在抠图时还需要用户绘制一个trimap作为模型输入&…

SpringBoot--Web开发篇:含enjoy模板引擎整合,SpringBoot整合springMVC;及上传文件至七牛云;restFul

SpringBoot的Web开发 官网学习&#xff1a; 进入spring官网 --> projects --> SpringBoot --> LEARN --> Reference Doc. --> Web --> 就能看到上述页面 静态资源映射规则 官方文档 总结&#xff1a; 只要是静态资源&#xff0c;放在类路径下&#xff1…

整理笔记——0欧电阻、电感、磁珠

设计电路时&#xff0c;经常用到0欧电阻、电感、磁珠&#xff0c;这三个基础电子原件万用表量都是“短路”&#xff0c;这三者之间有什么区别&#xff1f;什么情况下用什么原件&#xff1f; 一、0欧电阻 0欧电阻&#xff0c;并不是指元件的电阻值为0&#xff0c;而是电阻值很小…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

SpringBoot 日志

一、概述 日志是程序的重要组成部分&#xff0c;程序报错了&#xff0c;我们可以通过查看日志信息排除和定位问题。 二、日志格式 在启动 SpringBoot 项目时&#xff0c;控制台中默认会打印一些日志&#xff0c;下面我们截取一段日志信息&#xff0c;分析一下日志的格式&…

【蓝桥每日一题]-二分类型(保姆级教程 篇3) #路标设置 #跳石头

今天接着讲二分题型 目录 题目&#xff1a;路标设置 思路&#xff1a; 题目&#xff1a;跳石头 思路&#xff1a; 题目&#xff1a;路标设置 思路&#xff1a; 求&#xff1a;放n个路标后的最小空旷指数 二分查找&#xff1a;对空旷指数进行二分 二分依据: 该空旷指数下放…

支付宝本地生活团购服务商如何申请?两个方法教给你

支付开宝的本地生活来了&#xff01;按支付宝财大气粗的做法&#xff0c;它一旦要推什么项目&#xff0c;那自然会在前期疯狂洒钱&#xff0c;以求通过这种模式快速占领市场。 所以&#xff0c;这次支付宝要推本地生活项目&#xff0c;这一贯做法自然得跟上&#xff0c;只是这…

飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单

2023年10月26日&#xff0c;知名风险投资机构Runa Capital发布2023年第三季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。…

win10pycharm和anaconda安装和环境配置教程

windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…

基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP

最近我在 International Journal of Digital Earth &#xff08;《国际数字地球学报》&#xff09;发表了一篇森林生物量模型构建的文章&#xff1a;Evaluation of machine learning methods and multi-source remote sensing data combinations to construct forest above-gro…

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业&#xff0c;技术推动了虚拟资产投资市场的快速增长&#xff0c;但另一方面&#xff0c;JPEX诈骗案等行业风险事件也接连发生&#xff0c;为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上&#xff0c;行政长官李家超表示&#xff0c;与诈骗…

图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】

目录 一、前言二、统计区域度量2.1&#xff1a;图像矩特征2.1.1&#xff1a;原始矩/几何矩2.1.2&#xff1a;中心距2.1.3&#xff1a;归一化的中心矩2.1.4&#xff1a;不变矩——Hu矩2.1.5&#xff1a;OpenCv实现矩特征及其应用 2.2&#xff1a;点度量特征2.3&#xff1a;全局直…

在 GORM 中定义模型

为实现与数据库的无缝交互而打造有效模型的全面指南 在使用 GORM 进行数据库管理时&#xff0c;定义模型是基础。模型是您的应用程序的面向对象结构与数据库的关系世界之间的桥梁。本文深入探讨了在 GORM 中打造有效模型的艺术&#xff0c;探讨如何创建结构化的 Go 结构体&…

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

从零开始的目标检测和关键点检测&#xff08;三&#xff09;&#xff1a;训练一个Glue的RTMPose模型 一、重写config文件二、开始训练三、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测和关键点检测…

左移测试,如何确保安全合规还能实现高度自动化?

「云原生安全既是一种全新安全理念&#xff0c;也是实现云战略的前提。 基于蚂蚁集团内部多年实践&#xff0c;云原生PaaS平台SOFAStack发布完整的软件供应链安全产品及解决方案&#xff0c;包括静态代码扫描Pinpoint&#xff0c;软件成分分析SCA&#xff0c;交互式安全测试IA…

二、GRE VPN

GRE VPN 1、GRE介绍2、GRE基本原理3、GRE报文格式4、报文在GRE中传输过程5、价值6、Keepalive检测7、GRE应用8、配置GRE隧道8.1、配置绑定GRE协议的接口8.2、配置Tunnel接口8.3、配置Tunnel路由 9、GRE配置举例9.1、GRE静态路由示例9.1.1、路由器运行动态路由协议实现互通9.1.2…

NEFU数字图像处理(3)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中&#xff0c;我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分&#xff0c;背景是指和前景不相关的部分。例如&#xff0c;对于一张人物照片&#xff0c;人物就是前景&…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…