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