golang qq郵件發(fā)送驗證碼功能
驗證碼的使用場景
- 注冊/登錄:使用驗證碼可以有效減少垃圾賬號注冊和惡意登錄;
- 短信接口保護:高效減少防止短信接口被刷情況;
- 提交/投票:有效減少惡意刷單、惡意提交、惡意投票等情況;
- 密碼找回:用于找回密碼、修改手機等需要校驗用戶屬于本人操作的情況;
- 支付驗證:用戶付款時驗證手機號,保障用戶資金安全。
例子:golang發(fā)送qq郵件
第一步:拿到授權(quán)碼
通過編碼的方式發(fā)送郵件,就是調(diào)用qq郵箱提供的接口來進行郵件的發(fā)送,我們在編寫該功能前,需要拿到qq郵箱的POP3/SMTP服務(wù)的授權(quán)碼。
我們開啟SMTP/IMAP服務(wù),生成授權(quán)碼,保存一下授權(quán)碼,后面要用到。

第二步:下載依賴包
go get gopkg.in/gomail.v2
這個例子中我使用的是 gopkg.in/gomail.v2 包,發(fā)送郵件也可以用 github.com/jordan-wright/email 包。
第三步:寫代碼
注意要點:
驗證碼有效時間兩次發(fā)送驗證碼的間隔時間一個驗證碼只能使用一次
因為涉及到數(shù)據(jù)庫,所以我省略掉了這部分的代碼,讀者自行添加
將項目中的發(fā)送郵件的內(nèi)容抽取出來得到以下簡略代碼:
package main
import (
"fmt"
"gopkg.in/gomail.v2"
"math/rand"
"time"
)
// RandomGenerateVerificationCode 隨機生成長度為 l 的數(shù)字字母混合驗證碼
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 發(fā)送指定的郵件消息
func sendEmail(from string, to string, subject string, body string, authorizeCode string) error {
m := gomail.NewMessage()
// 設(shè)置郵件消息的頭部字段(例如發(fā)件人、收件人、主題等)。
m.SetHeader("From", from) // 發(fā)送人
m.SetHeader("To", to) // 接收人
// m.SetAddressHeader("Cc", "xxx@qq.com", "xiaozhujiao") // 抄送人
m.SetHeader("Subject", subject) // 主題
m.SetBody("text/plain", body) // 正文的內(nèi)容。text/plain表示純文本,"text/html" 表示 HTML 內(nèi)容。
// m.Attach("myIpPic.png") // 附件
// gomail.NewDialer():創(chuàng)建一個新的郵件撥號器對象,用于通過指定的 SMTP 服務(wù)器發(fā)送郵件。
// 四個參數(shù):
// host:SMTP 服務(wù)器的主機地址。例如 "smtp.qq.com"。
// port:SMTP 服務(wù)器的端口號。例如 587。
// username:SMTP 服務(wù)器的用戶名(通常是你的郵箱地址)。
// password:SMTP 服務(wù)器的密碼(或者授權(quán)碼)。
d := gomail.NewDialer("smtp.qq.com", 587, from, authorizeCode)
// 通過撥號器對象發(fā)送指定的郵件消息
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" // 授權(quán)代碼
err := sendEmail(from, to, subject, body, authorizeCode)
if err != nil {
fmt.Println("err = ", err)
return
}
// 從數(shù)據(jù)庫中檢驗密碼(注意密碼加密)......
}結(jié)果:

如果想要發(fā)送的結(jié)果更好看一點,我們可以添加html代碼,將main函數(shù)里面的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)再次運行代碼,結(jié)果如下:

當(dāng)然除此之外還有行為驗證碼,圖片驗證碼,語音驗證碼...圖片如下:


到此這篇關(guān)于golang qq郵件發(fā)送驗證碼的文章就介紹到這了,更多相關(guān)golang qq郵件發(fā)送驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang替換無法顯示的特殊字符(\u0000,?\000,?^@)
這篇文章主要介紹了golang替換無法顯示的特殊字符,包括的字符有\(zhòng)u0000,?\000,?^@等,下文詳細資料,需要的小伙伴可以參考一下2022-04-04
Go語言反射reflect.Value實現(xiàn)方法的調(diào)用
本文主要介紹了Go語言反射reflect.Value實現(xiàn)方法的調(diào)用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
關(guān)于Golang標(biāo)準(zhǔn)庫flag的全面講解
這篇文章主要介紹了關(guān)于Golang標(biāo)準(zhǔn)庫flag的全面講解,這個庫的代碼量只有1000行左右,卻提供了非常完善的命令行參數(shù)解析功能,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09
Golang使用archive/zip包實現(xiàn)ZIP壓縮與解壓
Golang?中的?archive/zip?包用于處理?ZIP?格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮?ZIP?格式文件的函數(shù)和類型,使用起來非常方便,下面就跟隨小編一起了解一下具體使用方法吧2023-08-08

