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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: gin学习——邮箱发送验证码注册用户

qq邮箱-设置-账户

安装

go get -u github.com/jordan-wright/email

go get -u github.com/garyburd/redigo/redis

dao/user_dao.go

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

// 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
  }
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
邮箱发送验证码
邮箱发送验证码
64 1
邮箱发送验证码
|
4月前
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
67 0
|
5天前
|
API 开发者
邮件API接口使用的方法和步骤
AOKSEND指南:了解和使用邮件API接口,包括选择适合的接口(如AOKSEND、Mailgun、SMTP),获取访问权限,配置发件人、收件人及邮件内容,调用接口发送邮件,并处理返回结果,以高效集成邮件功能。
|
8天前
|
API
邮件代发邮箱API发送邮件的方法和步骤
使用邮件代发邮箱API如AokSend、Mailgun、Amazon SES,可自动化发送邮件。步骤包括:选择API、获取API密钥、设置发件人信息、编写邮件内容、调用API发送并处理发送结果。AokSend提供高触达的SMTP/API接口和独立IP,适合大量验证码及触发式邮件发送,能有效提升工作效率。
|
11天前
|
API 开发者
触发式邮件邮箱API发送邮件的方法和步骤
触发式邮件API如Aoksend让开发者能基于特定事件自动发送邮件。选择邮箱提供商(如Aoksend、Mailgun、AWS SES),注册并获取API密钥,设置权限和验证。编写代码调用API(示例代码提供),并在用户注册、订单处理等事件触发时发送邮件,提升效率和准确性。
|
15天前
|
安全 API 数据安全/隐私保护
邮箱API提取邮件验证码技巧
本文介绍了如何高效提取和管理邮件验证码,涉及邮箱API原理、选择合适API、正确参数调用、安全处理、异常处理、应用场景及优化方法。注意遵守法律法规,保障用户隐私安全。
|
API PHP 开发工具
laravel中短信发送验证码的实现方法
在做用户注册和个人中心的安全管理时常常需要用到短信发送验证码,下面这篇文章主要给大家介绍了关于laravel中短信发送验证码的实现方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
3593 0
|
4月前
|
JSON 前端开发 安全
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-2
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
58 0
|
5月前
|
存储 前端开发 Java
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
65 0
uniapp手机号授权登录-现在只能通过手机号授权登录,后台来获取用户信息了效果demo(整理)
uniapp手机号授权登录-现在只能通过手机号授权登录,后台来获取用户信息了效果demo(整理)