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é)果如下:

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


到此這篇關(guān)于golang qq郵件發(fā)送驗證碼的文章就介紹到這了,更多相關(guān)golang qq郵件發(fā)送驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用gin框架實現(xiàn)一個完整的聊天室功能
由于我們項目的需要,我就研究了一下關(guān)于websocket的相關(guān)內(nèi)容,去實現(xiàn)一個聊天室的功能,經(jīng)過幾天的探索,現(xiàn)在使用Gin框架實現(xiàn)了一個完整的聊天室+消息實時通知系統(tǒng),感興趣的小伙伴歡迎閱讀本文2023-08-08
Golang中interface{}轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
GoLang strings.Builder底層實現(xiàn)方法詳解
自從學(xué)習(xí)go一個月以來,我多少使用了一下strings.Builder,略有心得。你也許知道它,特別是你了解bytes.Buffer的話。所以我在此分享一下我的心得,并希望能對你有所幫助2022-10-10

