本讲我们会讲到一些关于发邮件的技术。我们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会通过后台给用户发送网站最新的一些动向,一般是通过邮件来发送的。当你阅读完本节内容,会对发邮件的流程有一个大概的了解。

配置相关参数

发送邮件是需要配置相关参数的,且每个邮件服务商都有自己的配置值,笔者使用的是163邮箱,在settings.py追加如下配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'# 邮件配置
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'net936@163.com'
EMAIL_HOST_PASSWORD = 'your pwd'

一定要记得配置 EMAIL_BACKEND ,因为django默认配置的是一种模拟发邮件的 BackEnd ,并不能使用,故要替换。

实现发邮件

我们先来写订阅推送的路由,

path('subscribe/', views.SubscribeView.as_view(), name='subscribe'),

将路由设置为 SubscribeView

我们先贴出 SubscribeView 的代码

class SubscribeView(SuperUserRequiredMixin, generic.View):def get(self, request):video_list = Video.objects.get_published_list()return render(request, "myadmin/subscribe.html" ,{'video_list':video_list})def post(self, request): video_id = request.POST['video_id']video = Video.objects.get(id=video_id)subject = video.titlecontext = {'video': video,'site_url':settings.SITE_URL}html_message = render_to_string('myadmin/mail_template.html', context)email_list = User.objects.filter(subscribe=True).values_list('email',flat=True)# 分组email_list = [email_list[i:i + 2] for i in range(0, len(email_list), 2)]if email_list:for to_list in email_list:try:send_html_email(subject, html_message, to_list)except smtplib.SMTPException as e:logger.error(e)return JsonResponse({"code": 1, "msg": "发送失败"})return JsonResponse({"code": 0, "msg": "success"})else:return JsonResponse({"code": 1, "msg": "邮件列表为空"})

这是一个普通的视图类,功能是由get和post共同来完成的。get中设置了要显示的模板文件myadmin/subscribe.html,它是下面的样子

当我们要给用户发送邮件的时候,需要先选择要推送的视频。然后点击通知订阅用户,即可触发ajax发送代码,ajax代码位于static/js/myadmin/send_mail.js,里面最终调用的是SubscribeView中的post方法,中post方法中,我们先通过主键获取到视频的当前实例,并且还获取到所有订阅用户的email地址放到email_list中,最后调用send_html_email将邮件发送出去,send_html_email封装在helpers.py,它的具体代码是

def send_html_email(subject, html_message, to_list):plain_message = strip_tags(html_message)from_email = settings.EMAIL_HOST_USERsend_mail(subject, plain_message, from_email, to_list, html_message=html_message)def send_email(subject, content, to_list):try:message = (subject, content, settings.EMAIL_HOST_USER, to_list)send_mass_mail((message,))except smtplib.SMTPException :print("--> send fail")return HttpResponse("fail")else:print("--> send success")return HttpResponse("success")

从代码可以看出,程序最终调用的是django自带的 send_mass_mail 函数,该函数封装了发送邮件的细节。当然还可以使用 send_mail 函数,send_mail每次发邮件都会建立一个连接,发多封邮件时建立多个连接。而 send_mass_mail 是建立单个连接发送多封邮件,所以一次性发送多封邮件时 send_mass_mail 要优于 send_mail。

基于django的视频点播网站开发-step12-后台订阅功能相关推荐

  1. 基于django的视频点播网站开发-step12-后台订阅功能...

    本讲我们会讲到一些关于发邮件的技术.我们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会通过后台给用户发送网站最新的一些动向,一般是通过邮件来发送的.当你阅读完本节内容,会对发邮件的流程 ...

  2. 基于django的视频点播网站开发-step2-搭建环境

    本讲中,带领大家搭建开发环境.我们会依次安装python.pip.django.mysql和其他的一些必要类库. 安装python 安装 Python 非常简单,去 Python 官方网站 找到 Py ...

  3. 基于django的视频点播网站开发-step11-后台用户管理功能...

    用户管理功能,包含用户添加.列表展示.编辑.删除四大功能.下面我们一一揭晓. 用户添加 我们先实现用户添加功能,我们现在urls.py下添加相关的路由 path('user_add/', views. ...

  4. 基于django的视频点播网站开发-step10-后台评论管理功能...

    本讲中,我们会讲到评论管理功能,数据库中的每一条是来自用户的评价,因此后台中的评论管理只有评论列表和评论删除功能,没有增加评论和编辑评论. 照例我们先添加评论管理的相关路由 path('comment ...

  5. 基于python的电商网站建设_基于Django的电子商务网站开发

    Python的安装 目前市场上Python 2.X系列与Python 3.X系列共存的现象.读者可以安装Python 2.X系列或者Python 3.X系列.如果开发的目的是基于原有Python 2. ...

  6. 基于Django手机销售网站

    1,项目功能: (1)商品分类:该模块中,用户可以根据商品的分类信息进行商品检索. (2)商品预览:该模块主要实现商品的详细信息浏览功能. (3)购物车:用户可以把自己喜欢的商品添加到购物车中. (4 ...

  7. php动态网站开发论文,浅谈《基于PHP的动态网站开发》课程的项目案例设计

    电子论文 浅谈<基于PHP的动态网站开发>课程的项目案例设计 时间:2020年05月25日 所属分类:电子论文 点击次数: [摘要]在教学资源建设中,案例设计建设是非常重要的资源之一.运用 ...

  8. python毕业设计作品基于django框架校园网站系统毕设成品(3)后台管理功能

    整个项目包含了:开题报告 + 开题报告PPT + 任务书 + 中期报告 + 论文模板 + 答辩PPT等 + 项目源码 主要安介绍了系统在开发过程中所应用到的一些关键的技术 主要python技术介绍:框 ...

  9. 基于python的火车票售票系统/基于django火车票务网站/火车购票系统

    摘  要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,火车票售票系统当然也不能排除在外.火车票售票系统是以实际运用为开发背景,运用软件工 ...

最新文章

  1. python3 列表的增删改查
  2. java 抽象类,接口,object类详解
  3. 搜索业务增速下滑 Google廉颇老矣?
  4. 转载一篇NAT实验,备忘
  5. JavaScript实现跳跃游戏的动态编程自上而下的方法算法(附完整源码)
  6. linux salt生成,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  7. matplotlib-快速学习折线图-柱状图2个-饼图-0225
  8. 终于下决心写一写自己的博客了!
  9. JAVA RPC (六) 之thrift反序列化RPC消息体
  10. 数据库设计三大范式应用实例剖析(讲得比较清楚)
  11. Jupyter Notebook——如何显示目录的导航栏(安装 Jupyter Notebook extension)
  12. 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置
  13. qt 日历类 不可输入当前日期之后的日期_UI设计组件时间选择器,日历设计从未如此简单!...
  14. php中fread用法,php fread函数与fread函数用法
  15. 【XML系列】----DTD约束(一)
  16. osgEarth gpx文件 16.feature_gpx.earth
  17. 基于MATLAB的指纹识别算法仿真实现
  18. win7计算机时间同步出错,win7系统电脑时间同步出错的解决方法
  19. 公式图片转换成Word格式
  20. grafana配置alert

热门文章

  1. 【Python学习笔记】输入raw_input(),特殊情况下也可以用input()
  2. C#进阶系列——动态Lamada
  3. puppet自动化运维之资源关系
  4. 查看linux系统的平均负载
  5. Xshell 配置是vi显示多种颜色
  6. 职场小窍门:看穿同事性格的16个小动作
  7. 读WEB标准和网站重构后的一些感想
  8. 请与计算机管理员联系,电脑的限制被取消,请与管理员联系 解决方案
  9. 怎么把位域合成一个字节_C语言中字节对齐和位域
  10. 小白兔写话_小学二年级写话-我的小白兔