python(django)发送邮件+URL的序列化(加密)处理

原创 174阅读 · 时间2019年5月15日 16:32

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr


def mail():
    # 发件人邮箱账号
    my_sender = '你的邮箱账号'
    # 发件人邮箱密码 密码不是真正的密码,是授权码,授权码是用于登录第三方邮件客户端的专用密码。
    my_pass = '你的授权码'
    # 收件人邮箱账号
    # my_user = '收件人邮箱账号'
    # 开始填信
    mail_msg = '邮件内容'
    # 发送的邮件格式为 html 格式,邮件内容可以为html格式
    msg = MIMEText(mail_msg, 'html', 'utf-8')
    # 发送的邮件格式为正常文本格式
    # msg = MIMEText(mail_msg, 'plain', 'utf-8')
    msg['From'] = formataddr(["邮件头昵称", my_sender])
    msg['To'] = formataddr(["收件人头昵称的", my_user])
    msg['Subject'] = '邮件标题'
    # 我用的是QQ邮箱,所以smtp服务器是smtp.qq.com
    # 465 为端口号,因为服务器默认关闭25端口,故使用465端口
    server = smtplib.SMTP_SSL("smtp.qq.com", 465)
    # 登录
    server.login(my_sender, my_pass)
    # 发送
    server.sendmail(my_sender, [my_user, ], msg.as_string())
    server.quit()
    # 发送完毕,返回
    return

以上,就是发送邮件的代码! 

python 和再django项目中发送邮件都是一样的


如果出现错误,可尝试添加:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = '你的项目名称.settings'


【补充】

在django中我们往往需要发送验证邮箱、激活邮箱的等邮件,我们就要确保我们的激活邮箱的链接是唯一的,安全的。

我们将使用itsdangerous对我们的激活邮箱链接进行处理,可以说是加密!

以代码为例,我会尽可能清楚的写出注释


序列化+发送激活邮件

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
# 引入 itsdangerous
from itsdangerous import TimedJSONWebSignatureSerializer


def mail(user_email, id):
    # 可以为我们自己定义的任何盐值
    SECRET_KEY = '3_&qbax4_(xf!%ahsbahn(*8%o2-_1rzm)zr@^nht8q-dwq09z'
    # 对我们的盐值进行序列化和过期时间的设置
    s = TimedJSONWebSignatureSerializer(SECRET_KEY, expires_in=3600*24)
    # 对要激活邮箱的ID进行序列化
    token = s.dumps({'confirm': id})
    # 定义编码
    token = token.decode('utf8')
    # 将序列化完的ID 拼接到 URL中
    url = "http://www.ofus.ink/users/email_verification/{0}".format(token)
    
    # 发件人邮箱账号
    my_sender = '你的邮箱账号'
    # 发件人邮箱密码 密码不是真正的密码,是授权码,授权码是用于登录第三方邮件客户端的专用密码。
    my_pass = '你的授权码'
    # 收件人邮箱账号
    # my_user = '收件人邮箱账号'
    
    # 开始填信
    # 填写邮件内容 如下方所示
    mail_msg = '<h1>欢迎您</h1>请点击下方链接进行验证邮箱<br><small>请在24小时内点击验证,过期无效</small><a href="{0}">点我进行验证</a>'.format(url)
    msg = MIMEText(mail_msg, 'html', 'utf-8')
    
    msg['From'] = formataddr(["邮件头昵称", my_sender])
    msg['To'] = formataddr(["收件人头昵称的", my_user])
    msg['Subject'] = '邮件标题'
        
    # 我用的是QQ邮箱,所以smtp服务器是smtp.qq.com
     # 465 为端口号,因为服务器默认关闭25端口,故使用465端口
     server = smtplib.SMTP_SSL("smtp.qq.com", 465)
         
     # 登录
    server.login(my_sender, my_pass)
    # 发送
    server.sendmail(my_sender, [my_user, ], msg.as_string())
    server.quit()
    # 发送完毕,返回
    return


当用户点击激活链接进行激活邮箱的时候,我们的处理函数首先要反序列化得到我们的ID,然后进行激活。

反序列化 + 激活邮箱

def email_verification(request, token):
      # 盐值需要和发送邮件的盐值完全一致
    SECRET_KEY = '3_&qbax4_(xf!%ahsbahn(*8%o2-_1rzm)zr@^nht8q-dwq09z'
    # 序列化盐值和设置过期时间
    s = TimedJSONWebSignatureSerializer(SECRET_KEY, expires_in=3600*24)
    try:
          # 反序列化 传过来的toekn
        data = s.loads(token)
        # 得到ID
        id = data["confirm"]
        # 查找当前ID的用户
        user = models.User_more_info.objects.get(u_link_user=id)
        # 激活邮箱
        user.u_check_email = 1
        user.save()
        # 返回
        return redirect('/')
    # 验证失败,会抛出异常
    except:
        return HttpResponse('激活链接已过期')


如有不明白的地方,请在下方评论区指出,我会一步步完善每篇文章。




评论

本站升级中... 如有好的建议请加入QQ群!

相关文章推荐 ?
近七日热文推荐 !
回到顶部