博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于django的视频点播网站开发-step12-后台订阅功能
阅读量:5936 次
发布时间:2019-06-19

本文共 2806 字,大约阅读时间需要 9 分钟。

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

配置相关参数

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

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'# 邮件配置EMAIL_USE_SSL = TrueEMAIL_HOST = 'smtp.163.com'EMAIL_PORT = 465EMAIL_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.title context = {
'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_USER    send_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。

转载地址:http://tyttx.baihongyu.com/

你可能感兴趣的文章
Git分支合并:Merge、Rebase的选择
查看>>
技术文章是怎样炼成的?
查看>>
HDU-1128 Self Numbers 筛选
查看>>
Silverlight 5 深入理解 - TechEd2011葡萄城讲师课程
查看>>
js 选择 checkbox
查看>>
What is The Rule of Three?
查看>>
使用HTML5画布实现的超棒javascript动画仪表板:gauge.js
查看>>
node.js入门 - 2.创建一个简单聊天室
查看>>
For tomorrow's English test
查看>>
内容激活码jsp发送email
查看>>
ios 打电话结束返回到应用中
查看>>
当下全球最炙手可热的八位少年创业者
查看>>
JQuery 表单校验插件 validate 使用纪录
查看>>
开源项目与许可证
查看>>
已释放的栈内存
查看>>
MySQL字符串函数substring:字符串截取
查看>>
ystep jQuery流程、步骤插件
查看>>
JQuery+ajax+jsonp 跨域访问
查看>>
现代软件工程 第七章 【MSF】练习与讨论
查看>>
Android网络之数据解析----SAX方式解析XML数据
查看>>