本讲咱们会讲到一些关于发邮件的技术。咱们知道,订阅功能是一个很常见的功能,当用户订阅某个网站后,网站会经过后台给用户发送网站最新的一些动向,通常是经过邮件来发送的。当你阅读完本节内容,会对发邮件的流程有一个大概的了解。html
发送邮件是须要配置相关参数的,且每一个邮件服务商都有本身的配置值,笔者使用的是163邮箱,在settings.py追加以下配置ajax
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 ,并不能使用,故要替换。django
咱们先来写订阅推送的路由,bash
path('subscribe/', views.SubscribeView.as_view(), name='subscribe'),
复制代码
将路由设置为 SubscribeViewide
咱们先贴出 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,它是下面的样子post
当咱们要给用户发送邮件的时候,须要先选择要推送的视频。而后点击通知订阅用户,便可触发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。ui