版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzw2016/article/details/82086224
最近在看慕课网的利用Django搭建教学网站的视频,其中碰到了给注册用户发送激活邮件的问题。期间也遇到了一些小问题,在此记录一下。
实现邮件发送流程
利用django.core.mail模块下的send_email函数
from django.core.mail import send_email
配置settings.py实现邮件功能
QQ邮箱
# email配置
# IMAP/SMTP服务
EMAIL_HOST = "smtp.qq.com"
EMAIL_PORT = 25 # 大多都是25;若使用SSL,端口号465或587
EMAIL_HOST_USER = "" #发送邮箱
EMAIL_HOST_PASSWORD = "" # 使用的是QQ的授权码,不是你的密码
EMAILE_USE_TLS = True #一定要是True,否则发不了
EMAIL_FROM = "" #邮件发送人(邮件中所显示的发送人,和EMAIL_HOST_USER同)
这里之前你需要在邮箱设置中开启服务,例如QQ邮箱有两个服务:IMAP/SMTP服务、POP3/SMTP服务,随便开起一个就行。
关于这两个服务你可以查看下QQ邮箱的帮助,点击 IMAP、POP3介绍、区别及如何使用
EMAIL_HOST_PASSWORD 注意了是第三方登录的授权码,不是你的邮箱密码。服务设置下方有授权码获取方式,如图
如果是 POP3/SMTP服务
# qq POP3/SMTP 配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 110 # 或者 995是设置了 SSL 加密方式
EMAIL_HOST_USER = '' # 同上
EMAIL_HOST_PASSWORD = '' # 同上
EMAIL_USE_TLS = True # 同上
EMAIL_FROM = ‘’ # 同上
新浪邮箱
同样是开启服务,获取授权码
EMAIL_HOST = 'smtp.163.com' # 新浪 smtp 服务器地址
EMAIL_PORT = 25
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_FROM = ''
发送邮件函数send_email使用
send_email必填四个参数 Parameter 有 :subject 标题, message 主体, from_email 发送邮箱, recipient_list 邮件列表。recipient_list 是列表
# django自带的邮件发送模块
from django.core.mail import send_mail
from LMooc.settings import EMAIL_FROM
def send_register_email(email,send_type='register'):
# 实例化EmailVerifyRecord对象,将邮件内容保存到数据库,便于查询激活链接是否存在
# email_record = EmailVerifyRecord()
# email_record.email = email
# email_record.send_type = send_type
# email_record.code = random_str(20) #生成长20的随机字符串用以构成激活链接(域名/active/随机code/)
# 只要编写逻辑判断激活链接中的code是否有,就可以对应user的is_active=true
# email_record.save()
# 发送邮件功能如下
# email_title = ""邮件标题
# email_body = ""主体
if send_type == "register":
email_title = "你想写的内容"
email_body = "你想写的内容"
# Parameter:subject标题, message主体, from_email发送邮箱, recipient_list邮件列表,
send_status = send_mail(email_title,email_body,EMAIL_FROM,[email,]) #返回真值,判断是否发送OK
if send_status:
# 你想怎样
pass
另外发送邮件时遇到了个bug
django.db.utils.IntegrityError: UNIQUE constraint failed: user_userprofile.username
经过分析应该是在测试注册时,验证码多次输错,但是user对象已经保存过了(username是主键吧),再次输入保存该user时报错
增加判断存在逻辑
user = UserProfile()
...
user_exist = UserProfile.objects.filter(username=request.POST.get('email',''))
if user_exist:
return render(request, 'register.html', {'msg': "用户已存在"})
user.save()