Files
goinim/user/userregisterverify.go
2025-11-24 11:20:33 +08:00

128 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package user
import (
"context"
"encoding/json"
"fmt"
"html/template"
"io"
"log"
"net/http"
"net/smtp"
"strings"
"time"
"math/rand"
"github.com/go-redis/redis/v8"
)
type Userregveri struct {
Email string `json:"email"`
}
func randomCode() string {
source := rand.NewSource(time.Now().UnixNano())
r := rand.New(source)
letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
b := make([]rune, 6)
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
func Registerverify(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "http://localhost:5173")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
w.Header().Set("Access-Control-Allow-Credentials", "true")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
bodyrec, error := io.ReadAll(r.Body)
if error != nil {
fmt.Println("接受数据错误")
return
}
var bodyjx Userregveri
error = json.Unmarshal(bodyrec, &bodyjx)
if error != nil {
fmt.Println("数据解析失败")
return
}
var useremail = bodyjx.Email
log.Println("邮箱是", useremail)
redisdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
var redisverifyhash = "userverify"
_, error = redisdb.Ping(context.Background()).Result()
if error != nil {
log.Println("redis连接失败")
return
}
result, _ := redisdb.Exists(context.Background(), redisverifyhash, useremail).Result()
if result == 1 {
log.Println("用户验证码已经存在")
redisdb.HDel(context.Background(), redisverifyhash, useremail)
}
log.Println(result)
codesend := randomCode()
error = redisdb.HSet(context.Background(), redisverifyhash, map[string]string{
"useremail": useremail,
"userver": codesend,
}).Err()
if error != nil {
log.Println("redis键值设置失败")
return
}
_, error = redisdb.Expire(context.Background(), redisverifyhash, 3*time.Minute).Result()
if error != nil {
log.Println("有效时长设置失败")
return
}
from := "mayiming_person@163.com"
password := "VChadvNigu6TdzYH"
to := []string{useremail}
subject := "MS用户验证码 --MS助手"
htmlContent := `以下为您的验证码3分钟内有效请勿分享给别人. 验证码:` + string(codesend) + ``
t, err := template.New("emailBody").Parse(htmlContent)
if err != nil {
log.Fatal(err)
}
var bodyBuilder strings.Builder
err = t.Execute(&bodyBuilder, nil)
if err != nil {
log.Fatal(err)
}
body := bodyBuilder.String()
msg := "From: " + from + "\r\n" +
"To: " + to[0] + "\r\n" +
"Subject: " + subject + "\r\n" +
"\r\n" +
body
smtpServer := "smtp.163.com:25"
auth := smtp.PlainAuth("", from, password, "smtp.163.com")
err = smtp.SendMail(smtpServer, auth, from, to, []byte(msg))
if err != nil {
log.Fatal(err)
}
log.Println("邮箱发送成功!")
}