首页 > 其他分享 >Django实战项目-学习任务系统-发送邮件通知

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

时间:2023-11-03 11:00:50浏览次数:33  
标签:实战 task return Django content str 邮箱 邮件

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

 

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

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

 

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

因为微信网页版官网已经不支持了,所以不能使用 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 = '[email protected]'
    # 通过QQ邮箱设置获取的授权码,不是邮箱密码
    password = 'abcdefghijkmn'
    receiver = '[email protected]'
    # 设置服务器:这个是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 = '[email protected]'
        # 通过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 -------------------------------------------------

 

 

标签:实战,task,return,Django,content,str,邮箱,邮件
From: https://www.cnblogs.com/xh2023/p/17807063.html

相关文章

  • Django缓存机制
    一缓存介绍在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.缓存是将一些......
  • Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
    一、前言在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家......
  • django中几种下载文件的方法
    在django中有多种方式可以让前端下载一个文件,比如excel的文件。这里记录下几种实现的方式。一. 直接在django项目中有一个现成的excel文件且其中内容都有1.使用django中的HttpResponse类(1).使用open()打开二进制方式fromdjango.httpimportHttpResponsepath="a.xlsx"f=......
  • Spring Boot 实现 PDF 水印,实战来了!
    来源:cnblogs.com/hushaojun/p/16285486.html简介PDF(PortableDocumentFormat,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对PDF文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用SpringBoot......
  • 发送邮件公共方法
    你可以使用JavaMailAPI来发送包含参数的邮件。以下是一个简单的示例:importjavax.mail.;importjavax.mail.internet.;importjava.util.*;publicclassSendMail{publicstaticvoidmain(String[]args){//收件人信息Stringto="[email protected]";......
  • BSP视频教程第28期:CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 本期视频的实战性较强,涉及到的内容比较多,特别是PDO同步周期和同步非周期玩法要吃透。视频教程:https://www.bilibili.com/video/BV1zy4y1A7HS/视频提纲:参考资料:CANopen主从机代码,CAN词......
  • django搭建平台实战教程三:接口编写及权限校验(前后端分离)
    自定义权限校验注册增加group_id字段...@api_view(['POST'])defregister(request:Request):ifDUser.objects.filter(username=request.data["username"]).count()>0:returnResponse({"code":400,&qu......
  • 一文读懂强化学习:RL全面解析与Pytorch实战
    在本篇文章中,我们全面而深入地探讨了强化学习(ReinforcementLearning)的基础概念、主流算法和实战步骤。从马尔可夫决策过程(MDP)到高级算法如PPO,文章旨在为读者提供一套全面的理论框架和实用工具。同时,我们还专门探讨了强化学习在多个领域,如游戏、金融、医疗和自动驾驶等的具体应用......
  • Django实战项目-学习任务系统-查询列表分页显示
    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。本次增加查询列表分页显示功能,对一个查询列表功能进行分页改造,其他依此类推即可。......
  • 【PyTorch 卷积】实战自定义的图片归类
    前言        卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一,它通过卷积层、池化层、全连接层等结构,可以有效地处理如时间序列和图片数据等。关于卷积的概念网络上也比较多,这里就不一一描述了。实战为主当然要从实际问题出发,用代码......