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 -------------------------------------------------

 

 

posted @ 2023-11-03 10:54  PandaCode辉  阅读(47)  评论(0编辑  收藏  举报