基於django的視頻點播網站開發-step12-後臺訂閱功能

本講咱們會講到一些關於發郵件的技術。咱們知道,訂閱功能是一個很常見的功能,當用戶訂閱某個網站後,網站會經過後臺給用戶發送網站最新的一些動向,通常是經過郵件來發送的。當你閱讀完本節內容,會對發郵件的流程有一個大概的瞭解。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

相關文章
相關標籤/搜索