10-Email-Support
这是Go-Mega系列的第十部分,本章我将告诉你,应用如何向你的用户发送电子邮件,以及如何在电子邮件支持之上构建密码重置功能。
现在,应用在数据库方面做得相当不错,所以在本章中,我想抛开这个主题,开始添加发送电子邮件的功能,这是大多数Web应用必需的另一个重要部分。
为什么应用需要发送电子邮件给用户? 原因很多,但其中一个常见的原因是解决与认证相关的问题。 在本章中,我将为忘记密码的用户添加密码重置功能。 当用户请求重置密码时,应用将发送包含特制链接的电子邮件。 用户然后需要点击该链接才能访问设置新密码的表单。
本章的GitHub链接为: Source, Diff, Zip
第三方库支持
本章我们需要两个第三方插件 gomail 以及 jwt-go
# gomail
$ go get gopkg.in/gomail.v2
# jwt-go
$ go get github.com/dgrijalva/jwt-go加入mail支持
在 config 中增加 mail 设置
config.yml
mysql:
charset: utf8
db: dbname
host: localhost
password: password
user: root
mail:
smtp: smtp-server
smtp-port: 587
user: user
password: pwd这里的 smtp server, 请查看你的邮件提供商的文档,比如 zoho mail 的 smtp 是 smtp.zoho.com
config/g.go
在 controller/utils.go 封装 sendMail 函数,方便调用
controller/utils.go
本小节 Diff
请求重置密码
我上面提到过,用户有权利重置密码。因此我将在登录页面提供一个链接:
templates/content/login.html

当用户点击链接时,会出现一个新的Web表单,要求用户输入注册的电子邮件地址,以启动密码重置过程。
vm/reset_password_request.go
templates/content/reset_password_request.html
controller/home.go

controller 里涉及到了 email 的template
vm/email.go
templates/email.html

上面简单的一封邮件,其实蕴含着两个 非常重要的 知识点:
goroutine
原来 Flask-Mega 里面非常复杂的多线程操作,这里只用了一个 go function() 完成了
goroutine 可以说是 Go 这个语言的特色之一了,当然资料也比较多,大家可以深入了解下
这里我简单说下,就是 function 前面加个 go 关键字,就实现了 协程,用于高并发,而且性能非常好,是不是很cool!
jwt
具体可以通过 jwt.io了解下
或者中文的可以通过这片文章具体了解下 直通车
这里的邮件可以说是 JWT 的一个非常典型的应用场景,jwt 加密后的 URL 就是图中的一长串,其中其实隐含着 2 hour 过期时间
我们通过在 user.go 里加入两个function 就能实现, 密钥 secret 这里直接写在代码里,其实更优还是通过配置文件配置,又偷懒了
model/user.go
本小节 Diff
重置密码
目前我们点击邮件中的邮件是不能操作的,因为我们其实并没有 /reset_password 这个handler,那这里我们来完成它
其实密码重置就是一个简单的表单, 两个密码框,检验输入一致以及符合密码规范就可以了,操作起来不算太复杂。
vm/reset_password.go
templates/content/reset_password.html
controller/home.go

就这样我们完成了重置密码的功能,虽然设计到的页面比较多,不过只要我们思路清晰,一步一个脚印,还是能非常容易就能实现了。
现在输入新的密码,保存后,就可以用新密码登陆了。
本小节 Diff
Notice: 本章还涉及到一些后端验证,在这里没有一一列举,大家还是请看下源码diff,可以更完整的了解代码
Links
上一节: 09-Pagination
下一节: 11-Facelift
Last updated