前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gin学习——邮箱发送验证码注册用户

gin学习——邮箱发送验证码注册用户

作者头像
传说之下的花儿
发布2023-04-16 15:06:25
9600
发布2023-04-16 15:06:25
举报

qq邮箱-设置-账户

在这里插入图片描述
在这里插入图片描述

安装 go get -u github.com/jordan-wright/email go get -u github.com/garyburd/redigo/redis

dao/user_dao.go

代码语言:javascript
复制
func SendEmailValidate(em []string) (string,error) {
	e:=email.NewEmail()
	e.From = fmt.Sprintf("发件人笔名 <发件人邮箱>")
	e.To = em
	// 生成6位随机验证码
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	vCode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
	t := time.Now().Format("2006-01-02 15:04:05")
	//设置文件发送的内容
	content := fmt.Sprintf(`
	<div>
		<div>
			尊敬的%s,您好!
		</div>
		<div style="padding: 8px 40px 8px 50px;">
			<p>您于 %s 提交的邮箱验证,本次验证码为<u><strong>%s</strong></u>,为了保证账号安全,验证码有效期为5分钟。请确认为本人操作,切勿向他人泄露,感谢您的理解与使用。</p>
		</div>
		<div>
			<p>此邮箱为系统邮箱,请勿回复。</p>
		</div>
	</div>
	`, em[0], t, vCode)
	e.Text = []byte(content)
	//设置服务器相关的配置
	err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "发件人邮箱", "发件人邮箱授权码", "smtp.qq.com"))
	return vCode,err
}

controller/user_controller.go

代码语言:javascript
复制
// GetValidateCode
// @Title GetValidateCode
// @Description  发送邮箱验证码 并存入redis(5分钟有效时间)
// @Author hyy 2022-03-05 18:18:47
// @Param c type description
func GetValidateCode(c *gin.Context) {
	// 获取目的邮箱
	em := []string{c.Param("email")}
	vCode, err := dao.SendEmailValidate(em)
	if err != nil {
		log.Println(err)
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "验证码发送失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	// 验证码存入redis 并设置过期时间5分钟
	_, err = util.RedisCont.Do("set", "vCode", vCode)
	_, _ = util.RedisCont.Do("expire", "vCode", 300)
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "验证码存储失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"msg":    "验证码发送成功",
		"status": 200,
		"vCode":  vCode,
	})
	return
}

// ValidateEmailCode
// @Title ValidateEmailCode
// @Description  验证邮箱验证码,并注册用户。
// @Author hyy 2022-03-05 18:19:18
// @Param c type description
func ValidateEmailCode(c *gin.Context) {
	vCode := c.Param("vCode")
	var user model.User
	err := c.ShouldBindJSON(&user)
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "注册失败,json解析失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	// 默认用户权限为2
	if user.Level == 0 {
		user.Level = 2
	}
	user.CreatAt = time.Now().Format("2006-01-02 15:04:05")
	// 设置默认头像
	if user.HandPortrait == "" {
		user.HandPortrait = "https://gin-study-1308216693.cos.ap-nanjing.myqcloud.com/handportrait.png"
	}
	// 验证结构体字段
	if err := util.Validate.Struct(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"status":         400,
			"msg":            "注册失败,非法字段!",
			"ERROR-VALIDATE": util.GetErr(err),
		})
		return
	}
	// 对密码进行加密
	user.Password = util.Md5Encrypt(user.Password)
	// 获取存储在redis中的验证码
	vCodeRaw, err := util.RedisCont.Do("get", "vCode")
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "Redis获取vCode失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	if string(vCodeRaw.([]byte)) != "" && vCode == string(vCodeRaw.([]byte)) {
		result := service.InsertUser(&user)
		if result["result"].(bool) {
			result["msg"] = "注册成功!"
			c.JSON(http.StatusOK, result)
			return
		} else {
			c.JSON(http.StatusBadRequest, result)
			return
		}
	} else {
		c.JSON(http.StatusBadRequest, gin.H{
			"status": 400,
			"msg":    "验证码已失效",
		})
		return
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档