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

news2024/11/29 2:39:11

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

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

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

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

因为微信网页版官网已经不支持了,所以不能使用 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 -------------------------------------------------

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

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

相关文章

[开源]企业级在线办公系统,基于实时音视频完成在线视频会议功能

一、开源项目简介 企业级在线办公系统 本项目使用了SpringBootMybatisSpringMVC框架&#xff0c;技术功能点应用了WebSocket、Redis、Activiti7工作流引擎&#xff0c; 基于TRTC腾讯实时音视频完成在线视频会议功能。 二、开源协议 使用GPL-3.0开源协议 三、界面展示 部分…

git根据commitid创建tag标签

1.首先&#xff0c;创建一个新的标签。你可以使用以下命令创建一个轻量级标签&#xff08;lightweight tag&#xff09;&#xff1a; 针对当前标签而言,也就是你所在的当前分支而言 git tag <tag_name>2.如果你想创建一个带注释的标签 针对当前标签而言,也就是你所在的…

写出优美的代码:考虑使用静态工厂方法替代构造方法

文章目录 一、静态工厂方法区别于工厂方法模式二、静态工厂方法的优点1、有名字&#xff08;1&#xff09;优势&#xff08;2&#xff09;源码分析&#xff1a;BigInteger&#xff08;3&#xff09;源码分析&#xff1a;Executors&#xff08;4&#xff09;常用命名 名称 2、不…

Vue 自动登录示例

router.beforeEach((to, from, next) > {if (to.meta.title) {document.title "xxxxx" to.meta.title;}let token window.sessionStorage.getItem(userInfo);// 如果没有token 并且没有任何响应 就要去action中自动登录if (!token) {const loginForm {usernam…

在紫光同创盘古50K开发板上进行DDR读写测试

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL50H开发平台&#xff08;盘古50K开发板&#xff09; 一&#xff1a;软硬件平台 软件平台&#xff1a;PDS_…

DI93a HESG440355R3 通过其Achilles级认证提供网络安全

DI93a HESG440355R3 通过其Achilles级认证提供网络安全 施耐德电气宣布推出Modicon M580以太网PAC (ePAC)自动化控制器&#xff0c;该控制器采用开放式以太网标准&#xff0c;通过其Achilles级认证提供网络安全。M580 ePAC使工厂操作员能够设计、实施和运行一个积极利用开放网…

vue:js中合并对象的方法

目前比较常用的一共有三种 1、使用object.assign() 它可以将一个或多个对象的属性复制到目标对象中&#xff0c;第一个参数就是目标对象&#xff0c;这里举个例子&#xff1a; <template><div>{{data}}</div> </template> <script> export de…

【t5 pytorch版源码学习】t5-pegasus-pytorch源码学习

0. 项目来源 中文生成式预训练模型&#xff0c;以mT5为基础架构和初始权重&#xff0c;通过类似PEGASUS的方式进行预训练。 bert4keras版&#xff1a;t5-pegasus pytorch版&#xff1a;t5-pegasus-pytorch 本次主要学习pytorch版的代码解读。 项目结构&#xff1a; train…

一站式IT统一运维管理平台有哪些?大家都在用哪个?

随着公司业务的加大&#xff0c;不少企业从最初的一个运维系统增加到了几个运维系统&#xff0c;每个都是独立存在的&#xff0c;因此给运维小伙伴带来了不少困扰。因此不少小伙伴在问&#xff0c;有没有一站式IT统一运维管理平台&#xff1f;有哪些&#xff1f;大家都在用哪个…

HMDD 4.0:miRNA-疾病关系数据库

拥有多项自主专利技 术和软件著作权&#xff0c;具 有丰富的数据库平台 搭建经验。 凌恩-盈飞团队 MicroRNA&#xff08;miRNA&#xff09;是一类重要的小非编码RNA&#xff0c;在疾病诊断和治疗中发挥着重要作用。人类 MicroRNA 疾病数据库 (HMDD) 为 miRNA 相关医学提供了…

zookeeper节点类型

节点类型 持久节点&#xff08;Persistent Nodes&#xff09; 这些是Zookeeper中最常见的一种节点类型&#xff0c;当创建一个持久类型节点时&#xff0c;该值会一直存在zookeeper中&#xff0c;直到被显式删除或被新值覆盖。 临时节点&#xff08;Ephemeral Nodes&#xff…

基于Qt 的可视化图片处理程序——图片的加载与保存

基于Qt 的可视化图片处理程序——图片的加载与保存 Chapter1 基于Qt 的可视化图片处理程序——图片的加载与保存图片的加载图片加载到 Label完整代码图片的保存保存图片完整代码 void MainWindow::loadPixmap() {QImage img,image;QPixmap pixmap;LoadPicPath QFileDialog::ge…

(免费领源码)java#ssm#mysql爱心捐赠物资维护系统09536-计算机毕业设计项目选题推荐

摘要 随着信息技术的快速发展&#xff0c;计算机应用已经进入成千上万的家庭。随着物资数量的增加&#xff0c;物资库存管理也存在许多问题。物资数据的处理量正在迅速增加&#xff0c;原来的手工管理模式不适合这种形式。使用计算机可以完成数据收集、处理和分析&#xff0c;减…

vue3框架全局修改样式(字体颜色以及初始化定义基础elemplent颜色)

问题1、全局修改vue管理系统框架的字体颜色&#xff08;index.scss目录下修改&#xff09; 问题2、vue3中使用elemplent-plus中的el-select组件&#xff0c;默认选中二级或三级的一个数据&#xff0c;没有显示label只显示了id 问题如下 原因是因为 这个属性为true了&#xff0…

springboot+mybatis查询两次数据库结果不一致

最近遇到个bug记录一下。情景再现&#xff1a;在一个方法里有多次查询数据库的操作&#xff0c;但查询出的数据字段会被自动翻译。&#xff08;比如1翻译成是&#xff0c;2翻译成否&#xff09;。原因&#xff1a;mybatis缓存会被代码修改。在同一个sqlsession下&#xff0c;第…

彩色颜料背景的团建活动策划PPT模板

这是一套彩色颜料背景的团建活动策划PPT模板&#xff0c;共24页&#xff1b; PPT模板封面&#xff0c;使用了彩色颜料墨迹背景图片。中间放置带有阴影效果的白色矩形文本框&#xff0c;填写团建活动策划PPT标题。界面风格充满青春朝气。 PowerPoint模板内容页&#xff0c;由2…

Rust语言和curl库编写程序

这是一个使用Rust语言和curl库编写的爬虫程序&#xff0c;用于爬取视频。 use std::env; use std::net::TcpStream; use std::io::{BufReader, BufWriter}; ​ fn main() {// 获取命令行参数let args: Vec<String> env::args().collect();let proxy_host args[1].clon…

JVM 内存和 GC 算法

文章目录 内存布局直接内存执行引擎解释器JIT 即时编译器JIT 分类AOT 静态提前编译器&#xff08;Ahead Of Time Compiler&#xff09; GC什么是垃圾为什么要GC垃圾回收行为Java GC 主要关注的区域对象的 finalization 机制GC 相关算法引用计数算法&#xff08;Reference Count…

【嵌入式开发学习】__软件工程师的关键原则-18个系统设计概念

目录 前言 01. 域名系统 (DNS) 02. 负载均衡器 03. API 网关 04. 内容交付网络 (CDN) 05. 正向代理与反向代理 06. 缓存 07. 数据分区 08. 数据库复制 09. 分布式消息系统 10. 微服务 11. 数据库 12. 前端缓存 13. 后端缓存 14. 安全性 15. 高可用性与容错性 …

阿里云双11优惠活动:新老用户99元服务器和代金券领取攻略

2023阿里云双11优惠活动开启了&#xff0c;轻量2核2G3M带宽服务器87元一年、2核4G4M带宽165元一年&#xff0c;云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年&#xff0c;新老用户同享&#xff0c;并且续费不涨价&#xff0c;第二年99元续费。阿里云个人和企业用户还…