[网站功能]通过flask-mail登陆163邮箱发送邮件

网站部署到服务器已经一段时间了,但是一直没有添加用户忘记密码功能,本来目标是实现发送短信验证码重置密码的,查了下攻略,twilio好像只能免费发给在twilio验证过的手机号,而且我注册一直失败,转向国内阿里云的短信服务,看了下短信费一条4分5.....略贵。一个穷人就还是先老老实实通过注册邮箱实现密码重置吧。
代码是我在《flask web开发》这本书上看的,很简单,但是要连到163服务器并发送邮件还是遇到了2个问题的,而且邮箱也需要专门设置下,整了蛮久的,所以单写一篇关于怎么用flask通过163发送邮件的文章。依然step by step~

step1:设置163邮箱,获取SMTP登陆授权码

这个flask-mail中有个MAIL_PASSWORD的配置属性,这里不是让填你的邮箱登陆密码的,而是填写我们这一步即将获得的授权码
进入准备作为发件人的邮箱,点击【设置|客户端授权密码】,这里点击开启,会要先验证手机号,然后设置一个新密码并记住它!

[网站功能]通过flask-mail登陆163邮箱发送邮件_第1张图片
开启并获得授权码

step2:配置SMTP

先安装扩展pip install flask-mail
在config文件中添加以下属性

    MAIL_SERVER = 'smtp.163.com'
    MAIL_PORT = 25
    MAIL_USERNAME = '[email protected]'
    MAIL_PASSWORD = os.environ.get('MAIL_PWD')

我看了下网易官方显示支持安全链接和非安全链接两种链接方式。
非安全的就是我配置的这种,配合25端口,
安全的就是MAIL_USE_TLS=True1,配合端口是465,还有一个9XX(忘记了....)
但是我自己测试的是使用TLS连163的SMTP服务器都链接不到...一直报错,SMTPdisconncted之类的错误
所以还是老老实实用25端口吧!
这个要在环境中使用的密码是授权码!
用户就写成这个样子,不要不带163.com!

step3:发送邮件的函数

这个和书里面一样,没啥可说的,直接上代码!

def send_msg(to, title, template, **kwargs):
    from manage import app
    msg = Message(title, sender='小猫游园', recipients=to)
    msg.body = render_template(template+'.txt', **kwargs)
    msg.html = render_template(template+'.html', **kwargs)
    thr = Thread(target=send_sync_msg, args=[app, msg])
    thr.start()
    return thr


def send_sync_msg(app, msg):
    with app.app_context():
        mail.send(msg)

同样列一下毫无技术含量的模板内容...

您正在进行【小猫游园】的忘记密码操作,您的新密码是 xxxxxx,请使用新密码登陆后,在个人主页【修改密码】

这里需要特别注意几点
1.sender要写成我写的那个样子
2.recipients是个列表
3.本来我设想的是发送一个含username的token的链接,让用户点击直接重置密码的,但是经过测试,163会直接过滤掉链接!!!所以我选择了我这边直接给他改密码,让忘记密码的用户使用默认密码登陆后,再自行修改密码。

step4:发送邮件

#发送邮件
        to = [form.email.data]
        title = '【小猫游园】忘记密码'
        template = 'forget_pwd'
        user = User.query.filter_by(email=form.email.data).first()
        user.password = 'xxxxxx'
        db.session.add(user)
        send_msg(to=to, title=title, template=template)

把这个更加没有技术含量的代码列出来的原因是!
邮件的title!!!和body!!!
千千万万不要出行test和测试这个神奇的bug,
如果你用了这2词,你的发送就会碰到smtplib.SMTPDataError: (554, b'DT:SPM 163这个错误!!!

[网站功能]通过flask-mail登陆163邮箱发送邮件_第2张图片
终于发送成功啦~

SMTPSenderrefused 553
第二天发现密码必须发随机密码....昨天傻不拉几的把密码写成了一样的...然后修改后今天测试报错,是因为授权码从环境导入,所以在运行程序前,需要先导入授权码变量

至此~ 希望大家都能开开心心用代码发邮件~

你可能感兴趣的:([网站功能]通过flask-mail登陆163邮箱发送邮件)