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'), # 验证邮箱的 ....