网站部署到服务器已经一段时间了,但是一直没有添加用户忘记密码功能,本来目标是实现发送短信验证码重置密码的,查了下攻略,twilio好像只能免费发给在twilio验证过的手机号,而且我注册一直失败,转向国内阿里云的短信服务,看了下短信费一条4分5.....略贵。一个穷人就还是先老老实实通过注册邮箱实现密码重置吧。
代码是我在《flask web开发》这本书上看的,很简单,但是要连到163服务器并发送邮件还是遇到了2个问题的,而且邮箱也需要专门设置下,整了蛮久的,所以单写一篇关于怎么用flask通过163发送邮件的文章。依然step by step~
step1:设置163邮箱,获取SMTP登陆授权码
这个flask-mail中有个MAIL_PASSWORD的配置属性,这里不是让填你的邮箱登陆密码的,而是填写我们这一步即将获得的授权码
进入准备作为发件人的邮箱,点击【设置|客户端授权密码】,这里点击开启,会要先验证手机号,然后设置一个新密码并记住它!
step2:配置SMTP
先安装扩展pip install flask-mail
在config文件中添加以下属性
MAIL_SERVER = 'smtp.163.com'
MAIL_PORT = 25
MAIL_USERNAME = 'catyynet@163.com'
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='小猫游园<catyynet@163.com>', 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)
同样列一下毫无技术含量的模板内容...
<p>您正在进行【小猫游园】的忘记密码操作,您的新密码是
<b>xxxxxx</b>,请使用新密码登陆后,在个人主页【修改密码】</p>
这里需要特别注意几点
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
这个错误!!!
SMTPSenderrefused 553
第二天发现密码必须发随机密码....昨天傻不拉几的把密码写成了一样的...然后修改后今天测试报错,是因为授权码从环境导入,所以在运行程序前,需要先导入授权码变量
至此~ 希望大家都能开开心心用代码发邮件~