第九章:django开发中发送邮件

django中集成了发送邮件的模块from django.core import mail

一、选用邮箱的配置

这里以QQ邮箱为例(163邮箱)也一样的,点击设置–>账户–>生成授权码

这里写图片描述

二、在setting.py中配置

# 配置邮箱  
EMAIL_HOST_PASSWORD = 'xxxxxxxxxx' # 授权码
EMAIL_HOST_USER = 'xxxxxxx@qq.com' # 邮箱账号(发件箱)
EMAIL_HOST = 'smtp.qq.com' #SMTP域名
EMAIL_PORT = 587    #邮箱端口号  
EMAIL_USE_TLS = True #是否加密

三、在视图类中定义发送邮件

  • 1、导入邮件包

    from django.core import mail
  • 2、发送邮件send_mail源码

    """
    subject 主题
    message 内容
    from_email 发送者(自己指定)
    recipient_list 接收者(是一个list)
    """
    def send_mail(subject, message, from_email, recipient_list,
                  fail_silently=False, auth_user=None, auth_password=None,
                  connection=None, html_message=None):
  • 3、测试发送邮件

    
    # 修改邮箱的视图类 
    
    @login_required
    @require_http_methods(["POST"])
    def update_email(request):
        form = UpdateEmailForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email', None)
            if email:
                mail.send_mail(u'测试邮件发送', u'你好', '33xxx34@qq.com', [email])
                return JsonResponse({'code':200,'info':'success'})
            else:
                return JsonResponse({'error':'邮箱丢失'})
        else:
            return JsonResponse({'error': form.errors.as_json()})
  • 4、前端ajax提交代码

    /**
     * 发送邮件的ajax
     */
    $('#send-email').on('click',function () {
        var email = $('#email-address').val().trim();
        if(!email){
            return false;
        }
        $.ajax({
            'url':'/cms/update_email/',
            'method':'post',
            'data':{
                'email':email
            },
            'success':function (data) {
                console.log(data)
            },
            'error':function (errors) {
                console.log(errors);
            },
            'beforeSend': function (xhr, settings) {
                var csrftoken = getCookie('csrftoken');
                //2.在header当中设置csrf_token的值
                xhr.setRequestHeader('X-CSRFToken', csrftoken);
            }
        })
    })

四、项目开发中常用发用邮件验证的方式

  • 1、发送一段随机数字验证,可能要优化下(判断同一个邮箱在5分钟内不能再次发送)

    
    # 导入邮件模块
    
    from django.core import mail
    import string
    import random
    from django.core.cache import cache
    
    # 修改邮箱的视图类
    
    @login_required
    @require_http_methods(["POST"])
    def update_email(request):
        form = UpdateEmailForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email', None)
            if email:
                # 生成随机数的
                source = list(string.letters)
                for x in xrange(0, 10):
                    source.append(str(x))
                captcha_list = random.sample(source, 4)
                captcha = ''.join(captcha_list)
                mail.send_mail(u'测试邮件发送', captcha, '33xxxx4@qq.com', [email])
                # 将随机数存入缓存中,等待用户输入验证 5分钟 
                cache.set(email,captcha,300)
    
                return JsonResponse({'code':200,'info':'success'})
            else:
                return JsonResponse({'error':'邮箱丢失'})
        else:
            return JsonResponse({'error': form.errors.as_json()})
  • 2、发送一个url地址用户点击就验证通过

    • 1、发送邮箱的视图类

      import hashlib
      import time
      from django.core import mail
      from django.core.cache import cache
      
      # 修改邮箱的视图类    
      
      @login_required
      @require_http_methods(["POST"])
      def update_email(request):
          form = UpdateEmailForm(request.POST)
          if form.is_valid():
              email = form.cleaned_data.get('email', None)
              if email:
                  # 1.将邮箱存储到缓存中(key使用时间鹾+邮箱md5加密)
                  code = hashlib.md5(str(time.time()) + email).hexdigest()
                  cache.set(code, email, 300)
                  # 2.拼接一个url地址
                  check_url = request.scheme + '://' + request.get_host() + reverse('cms_check_email', kwargs={'code': code})
                  # 3.配置发送邮件参数
                  subject = u'邮箱修改验证'
                  # message中应该包含验证的链接
                  message = u'博客验证链接,点击 ' + check_url + u'  ,请在5分钟内完成注册。工作人员不会向您索取验证码,请勿泄露。'
                  from_mail = '33xxxx4@qq.com'
                  recipient_list = [email]
                  # 4.发送邮件
                  mail.send_mail(subject, message, from_mail, recipient_list)
                  # 5.返回状态
                  return JsonResponse({'code':200,'info':'success'})
              else:
                  return JsonResponse({'error':'邮箱丢失'})
          else:
              return JsonResponse({'error': form.errors.as_json()})
    • 2、验收邮箱的视图类

      
      # 定义一个验证邮箱的视图类
      
      @login_required
      @require_http_methods(['GET'])
      def check_email(request,code):
          if len(code) > 0:
              # 从缓存中获取email
              email = cache.get(code)
              if email:
                  user = request.user
                  user.email = email
                  user.save(update_fields=['email'])
                  return HttpResponse(u'邮箱修改成功')
              else:
                  return HttpResponse(u'该链接已经失效')
          else:
              return HttpResponse(u'该链接已经失效')
    • 3、urls.py中的配置

      ...
      url(r'^update_email/$', views.update_email, name='cms_update_email'), # 更改邮箱  
      url(r'^check_email/(?P<code>\w+)$',views.check_email,name='cms_check_email'), # 验证邮箱的
      ....
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值