golang qq邮件发送验证码功能

 更新时间:2024年09月26日 15:16:20   作者:壮Sir不壮  
验证码在多个场景下发挥着重要作用,如注册/登录、短信接口保护、提交/投票、密码找回和支付验证等,以保障账号安全和防止恶意操作,此外,文章还介绍了使用golang通过qq邮件发送验证码的实现过程,包括获取授权码、下载依赖包和编写代码,感兴趣的朋友跟随小编一起看看吧

验证码的使用场景

  • 注册/登录:使用验证码可以有效减少垃圾账号注册和恶意登录;
  • 短信接口保护:高效减少防止短信接口被刷情况;
  • 提交/投票:有效减少恶意刷单、恶意提交、恶意投票等情况;
  • 密码找回:用于找回密码、修改手机等需要校验用户属于本人操作的情况;
  • 支付验证:用户付款时验证手机号,保障用户资金安全。

例子:golang发送qq邮件

第一步:拿到授权码

通过编码的方式发送邮件,就是调用qq邮箱提供的接口来进行邮件的发送,我们在编写该功能前,需要拿到qq邮箱的POP3/SMTP服务的授权码。

我们开启SMTP/IMAP服务,生成授权码,保存一下授权码,后面要用到。

第二步:下载依赖包

 go get gopkg.in/gomail.v2

这个例子中我使用的是 gopkg.in/gomail.v2 包,发送邮件也可以用 github.com/jordan-wright/email 包。

第三步:写代码

注意要点:

验证码有效时间两次发送验证码的间隔时间一个验证码只能使用一次

因为涉及到数据库,所以我省略掉了这部分的代码,读者自行添加

将项目中的发送邮件的内容抽取出来得到以下简略代码:

package main
import (
	"fmt"
	"gopkg.in/gomail.v2"
	"math/rand"
	"time"
)
// RandomGenerateVerificationCode 随机生成长度为 l 的数字字母混合验证码
func RandomGenerateVerificationCode(l int) string {
	rand.Seed(time.Now().UnixNano())
	const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	b := make([]byte, l)
	for i := range b {
		b[i] = letters[rand.Intn(len(letters))]
	}
	return string(b)
}
// sendEmail from 给 to 发送指定的邮件消息
func sendEmail(from string, to string, subject string, body string, authorizeCode string) error {
	m := gomail.NewMessage()
	// 设置邮件消息的头部字段(例如发件人、收件人、主题等)。
	m.SetHeader("From", from) // 发送人
	m.SetHeader("To", to)     //  接收人
	// m.SetAddressHeader("Cc", "xxx@qq.com", "xiaozhujiao") // 抄送人
	m.SetHeader("Subject", subject) // 主题
	m.SetBody("text/plain", body)   // 正文的内容。text/plain表示纯文本,"text/html" 表示 HTML 内容。
	// m.Attach("myIpPic.png") // 附件
	// gomail.NewDialer():创建一个新的邮件拨号器对象,用于通过指定的 SMTP 服务器发送邮件。
	// 四个参数:
	// host:SMTP 服务器的主机地址。例如 "smtp.qq.com"。
	// port:SMTP 服务器的端口号。例如 587。
	// username:SMTP 服务器的用户名(通常是你的邮箱地址)。
	// password:SMTP 服务器的密码(或者授权码)。
	d := gomail.NewDialer("smtp.qq.com", 587, from, authorizeCode)
	// 通过拨号器对象发送指定的邮件消息
	if err := d.DialAndSend(m); err != nil {
		return err
	}
	return nil
}
func main() {
	l := 6
	code := RandomGenerateVerificationCode(l)
	from := "XXXXXXXXX@qq.com"
	to := "XXXXXXX@qq.com"
	subject := "验证码"
	body := fmt.Sprintf("你的验证码为 %s,有效时间为 %s\n", code, "5分钟")
	authorizeCode := "XXXXXXXXXXXX" // 授权代码
	err := sendEmail(from, to, subject, body, authorizeCode)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	// 从数据库中检验密码(注意密码加密)......
}

结果:

如果想要发送的结果更好看一点,我们可以添加html代码,将main函数里面的body修改为:

body := fmt.Sprintf(`
		<!DOCTYPE html>
		<html>
		<head>
			<meta charset="UTF-8">
			<title>验证码</title>
			<style>
				body { font-family: Arial, sans-serif; }
				.container { padding: 20px; border: 1px solid #ddd; border-radius: 5px; }
				h1 { color: #333; }
				.code { font-size: 24px; font-weight: bold; color: #007bff; }
				.footer { margin-top: 20px; font-size: 12px; color: #888; }
			</style>
		</head>
		<body>
			<div class="container">
				<h1>你的验证码</h1>
				<p class="code">%s</p>
				<p>有效时间为 5 分钟</p>
				<div class="footer">如果您没有请求此验证码,请忽略此邮件。</div>
			</div>
		</body>
		</html>
	`, code)

再次运行代码,结果如下:

当然除此之外还有行为验证码,图片验证码,语音验证码...图片如下:

到此这篇关于golang qq邮件发送验证码的文章就介绍到这了,更多相关golang qq邮件发送验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go-zero服务部署配置及源码解读

    go-zero服务部署配置及源码解读

    这篇文章主要为大家介绍了go-zero服务部署配置及源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go strconv包实现字符串和基本数据类型转换的实例详解

    Go strconv包实现字符串和基本数据类型转换的实例详解

    在Go语言(Golang)的编程实践中,strconv包是一个非常重要的标准库,它提供了在基本数据类型(如整型、浮点型、布尔型)和字符串之间的转换功能,本文给大家介绍了关于Go语言字符串转换strconv,需要的朋友可以参考下
    2024-09-09
  • Golang的Crypto/SHA256库实战指南

    Golang的Crypto/SHA256库实战指南

    无论是在保护数据安全、验证数据完整性,还是在构建复杂的安全系统中,crypto/sha256都是Golang程序员不可或缺的工具,本文主要介绍了Golang的Crypto/SHA256库实战指南,感兴趣的可以了解一下
    2024-02-02
  • Go语言:打造优雅数据库单元测试的实战指南

    Go语言:打造优雅数据库单元测试的实战指南

    Go语言数据库单元测试入门:聚焦高效、可靠的数据库代码验证!想要确保您的Go应用数据层坚如磐石吗?本指南将手把手教您如何利用Go进行数据库单元测试,轻松揪出隐藏的bug,打造无懈可击的数据处理逻辑,一起来探索吧!
    2024-01-01
  • 浅谈Go Slice 高级实践

    浅谈Go Slice 高级实践

    这篇文章主要介绍了浅谈Go Slice 高级实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Go语言实战之切片内存优化

    Go语言实战之切片内存优化

    Go 语言的切片是一个动态的数据结构,可以方便地对其进行扩容和缩容操作。这篇文章主要为大家详细介绍了Go语言如何实现切片内存优化,需要的可以参考一下
    2023-03-03
  • 详解Go语言中切片的长度与容量的区别

    详解Go语言中切片的长度与容量的区别

    切片可以看成是数组的引用,切片的长度是它所包含的元素个数。切片的容量是从它的第一个元素到其底层数组元素末尾的个数。本文将通过示例详细讲讲Go语言中切片的长度与容量的区别,需要的可以参考一下
    2022-11-11
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现

    你在开发或者面试过程中,有没有遇到过 海量数据需要查重,缓存穿透怎么避免等等这样的问题呢?下面这个东西超棒,好好了解下,面试过关斩将,凸显你的不一样
    2022-10-10
  • Go高级特性之并发处理http详解

    Go高级特性之并发处理http详解

    Golang 作为一种高效的编程语言,提供了多种方法来实现并发发送 HTTP 请求,本文将深入探讨 Golang 中并发发送 HTTP 请求的最佳技术和实践,希望对大家有所帮助
    2024-02-02
  • 使用Gomock进行单元测试的方法示例

    使用Gomock进行单元测试的方法示例

    这篇文章主要介绍了使用Gomock进行单元测试的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论