Go语言实现邮箱验证/邮件发送


Go语言实现邮箱验证/邮件发送

1.首先设置邮箱的smtp

SMTP服务器就是邮件代收发服务器,由邮件服务商提供,常见的SMTP服务器端口号:
QQ邮箱:SMTP服务器地址:smtp.qq.com(端口:587)
雅虎邮箱: SMTP服务器地址:smtp.yahoo.com(端口:587)
163邮箱:SMTP服务器地址:smtp.163.com(端口:25)
126邮箱: SMTP服务器地址:smtp.126.com(端口:25)
新浪邮箱: SMTP服务器地址:smtp.sina.com(端口:25)

登录邮箱账户 设置开启SMTP 并获取授权码

我使用的是QQ邮箱进行测试

qqmail

QQ邮箱默认关闭SMTP服务,将IMAP/SMTP服务打开,跟着流程做后你会得到令牌密码。

代码实现如下:

func SendToMail(rand, to string) error {

	subject := "动态验证码"
	user := "user@qq.com"
	password := "**********" //输入刚得到的令牌
	host := "smtp.qq.com:587"
	body := "您的动态验证码为:" + rand + ",您正在进行密码重置操作,如非本人操作,请忽略本邮件!"

	sendUserName := "senderName" //发送邮件的人名称
	fmt.Println("send email")
	hp := strings.Split(host, ":")
	auth := smtp.PlainAuth("", user, password, hp[0])
	var content_type string
	mailtype := ""
	if mailtype == "html" {
		content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"
	} else {
		content_type = "Content-Type: text/plain" + "; charset=UTF-8"
	}

	msg := []byte("To: " + to + "\r\nFrom: " + sendUserName + "<" + user + ">" + "\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
	send_to := strings.Split(to, ";")
	err := smtp.SendMail(host, auth, user, send_to, msg)
	fmt.Println("send email")
	if err != nil {
		fmt.Println("Send mail error!")
		fmt.Println(err)
	} else {
		fmt.Println("Send mail success!")
	}
	return err
}

func main(){
	//发送验证码
	randcode := Utils.GenerateRandNum(6)//随机6位数
	err = Models.SendToMail(randcode,user.Email)
    log.Printf("验证码发送失败,err:%s",err)
	c.JSON(http.StatusOK, gin.H{
		"verification": randcode,
		"result":       "发送成功",
	})

}

成功发送:

success

遇到的几个坑

  • smtp.SendMail 后出现 EOF 失败

解决方法: QQmail 的 465 端口用于通过 TLS 连接,但 SendMail 需要普通的旧 TCP。尝试连接到端口 587。SendMail 将在可用时自动升级到 TLS(在本例中就是这种情况)。

还需要解决的问题:

  • 这个只能单人进行验证,如果多个人同时验证会造成验证码记录覆盖,导致用户输入验证码错误。

代解决。。。

解决方法: 将验证码记录在本地数据库个人用户的字段中,并设置过期时间,时间一到就会被覆盖掉;
验证时,在过期时间之前,通过邮箱号查找验证码比较是否相同,即可解决多个用户验证问题。


文章作者: hypo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hypo !
评论
 上一篇
Go语言使用阿里云实现短信发送/验证服务(gin框架) Go语言使用阿里云实现短信发送/验证服务(gin框架)
Go语言使用阿里云实现短信发送/验证服务(gin框架)
2021-12-16
下一篇 
Gin框架中使用JWT进行接口认证 Gin框架中使用JWT进行接口认证
在如今前后端分离开发的大环境中,我们需要解决一些登陆,后期身份认证以及鉴权相关的事情,通常的方案就是采用请求头携带token的方式进行实现。本篇文章主要分享下在Golang语言下使用JWT
2021-12-07