Ohio-HYF 3 years ago
parent
commit
170e1e38fc
8 changed files with 109 additions and 1 deletions
  1. 6 0
      config/mail.json
  2. 2 0
      go.mod
  3. 4 0
      go.sum
  4. 15 0
      handler/send_code.go
  5. 5 1
      main.go
  6. 1 0
      model/http_model/send_code.go
  7. 60 0
      service/mail.go
  8. 16 0
      service/send_code.go

+ 6 - 0
config/mail.json

@@ -0,0 +1,6 @@
+{
+    "stmp_server": "smtp.qq.com",
+    "stmp_port": "587",
+    "stmp_user_name": "2467835131@qq.com",
+    "stmp_auth_token": "fqvrcfvlugygdjdc"
+}

+ 2 - 0
go.mod

@@ -29,6 +29,8 @@ require (
 	golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12 // indirect
 	golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12 // indirect
 	golang.org/x/tools v0.1.10 // indirect
 	golang.org/x/tools v0.1.10 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
+	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
 	gopkg.in/yaml.v2 v2.4.0
 	gopkg.in/yaml.v2 v2.4.0
 	gorm.io/driver/mysql v1.3.2
 	gorm.io/driver/mysql v1.3.2
 	gorm.io/gorm v1.23.3
 	gorm.io/gorm v1.23.3

+ 4 - 0
go.sum

@@ -278,6 +278,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -285,6 +287,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 15 - 0
handler/send_code.go

@@ -58,6 +58,21 @@ func (h *SendCodeHandler) run() {
 	vcode := service.SendCode.GetCode(h.ctx)
 	vcode := service.SendCode.GetCode(h.ctx)
 	// 2. 发送验证码
 	// 2. 发送验证码
 	fmt.Println(vcode)
 	fmt.Println(vcode)
+	if data.Email == "login" {
+		// 根据手机号查询邮箱
+		email, err := service.SendCode.GetEmailByPhone(h.ctx, data.Phone)
+		if err != nil {
+			logrus.Errorf("[SendeCodeHandler] call SetSession err:%+v\n", err)
+			util.HandlerPackErrorResp(h.resp, consts.ErrorInternal, "")
+			log.Info("SendeCode fail,req:%+v", h.req)
+			return
+		}
+		subject := "Youngee验证码"
+		service.SMTPMailServiceIstance.SendHtmlMail(email, subject, vcode)
+	} else {
+		subject := "Youngee验证码"
+		service.SMTPMailServiceIstance.SendHtmlMail(data.Email, subject, vcode)
+	}
 
 
 	// 3. {phone:code}存到redis
 	// 3. {phone:code}存到redis
 	err := service.SendCode.SetSession(h.ctx, data.Phone, vcode)
 	err := service.SendCode.SetSession(h.ctx, data.Phone, vcode)

+ 5 - 1
main.go

@@ -2,16 +2,20 @@ package main
 
 
 import (
 import (
 	"fmt"
 	"fmt"
-	"github.com/gin-gonic/gin"
 	"youngee_b_api/config"
 	"youngee_b_api/config"
 	_ "youngee_b_api/docs"
 	_ "youngee_b_api/docs"
 	"youngee_b_api/route"
 	"youngee_b_api/route"
+	"youngee_b_api/service"
+
+	"github.com/gin-gonic/gin"
 )
 )
 
 
 func main() {
 func main() {
 	r := gin.Default()
 	r := gin.Default()
 	route.InitRoute(r)
 	route.InitRoute(r)
 	config := config.Init()
 	config := config.Init()
+	mailConfig := "./config/mail.json"
+	service.SMTPMailServiceIstance.Init(mailConfig)
 	addr := fmt.Sprintf("%v:%v", config.Host, config.Port)
 	addr := fmt.Sprintf("%v:%v", config.Host, config.Port)
 	r.Run(addr) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 	r.Run(addr) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
 }
 }

+ 1 - 0
model/http_model/send_code.go

@@ -3,6 +3,7 @@ package http_model
 // SendCodeRequest 发送验证码请求的格式
 // SendCodeRequest 发送验证码请求的格式
 type SendCodeRequest struct {
 type SendCodeRequest struct {
 	Phone string `json:"phone"`
 	Phone string `json:"phone"`
+	Email string `json:"email"`
 }
 }
 
 
 // SendCodeData 发送验证码请求返回的数据
 // SendCodeData 发送验证码请求返回的数据

+ 60 - 0
service/mail.go

@@ -0,0 +1,60 @@
+package service
+
+import (
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"strconv"
+
+	"gopkg.in/gomail.v2"
+)
+
+var SMTPMailServiceIstance *SMTPMailService = new(SMTPMailService)
+
+type SMTPMailService struct {
+	smtpServer    string
+	smtpPort      int
+	smtpUserName  string
+	smtpAuthToken string
+}
+
+func (s *SMTPMailService) Init(configPath string) {
+	configMap := make(map[string]string)
+	content, err := ioutil.ReadFile(configPath)
+	if err != nil {
+		panic(err)
+	}
+	err = json.Unmarshal(content, &configMap)
+	if err != nil {
+		panic(err)
+	}
+	stmpPort, _ := strconv.Atoi(configMap["stmp_port"])
+	s.smtpServer = configMap["stmp_server"]
+	s.smtpPort = stmpPort
+	s.smtpUserName = configMap["stmp_user_name"]
+	s.smtpAuthToken = configMap["stmp_auth_token"]
+}
+func (s *SMTPMailService) SendHtmlMail(receiverMail, subject, body string) error {
+	m := gomail.NewMessage()
+	//发送人
+	m.SetHeader("From", s.smtpUserName)
+	//接收人
+	m.SetHeader("To", receiverMail)
+	//抄送人
+	//m.SetAddressHeader("Cc", "xxx@qq.com", "xiaozhujiao")
+	//主题
+	m.SetHeader("Subject", subject)
+	//内容
+	m.SetBody("text/html", body)
+
+	//拿到token,并进行连接,第4个参数是填授权码
+	d := gomail.NewDialer(s.smtpServer, s.smtpPort, s.smtpUserName, s.smtpAuthToken)
+
+	// 发送邮件
+	if err := d.DialAndSend(m); err != nil {
+		fmt.Printf("DialAndSend err %v:", err)
+		return err
+	}
+	fmt.Printf("send mail success\n")
+	return nil
+}

+ 16 - 0
service/send_code.go

@@ -2,12 +2,16 @@ package service
 
 
 import (
 import (
 	"context"
 	"context"
+	"errors"
 	"fmt"
 	"fmt"
 	"math/rand"
 	"math/rand"
 	"time"
 	"time"
 	"youngee_b_api/consts"
 	"youngee_b_api/consts"
+	"youngee_b_api/db"
 	"youngee_b_api/model/system_model"
 	"youngee_b_api/model/system_model"
 	"youngee_b_api/redis"
 	"youngee_b_api/redis"
+
+	"github.com/sirupsen/logrus"
 )
 )
 
 
 var SendCode *sendCode
 var SendCode *sendCode
@@ -39,3 +43,15 @@ func (s *sendCode) SetSession(ctx context.Context, phone string, vcode string) e
 func (s *sendCode) getRedisKey(key string) string {
 func (s *sendCode) getRedisKey(key string) string {
 	return fmt.Sprintf("%s%s", consts.SessionRedisPrefix, key)
 	return fmt.Sprintf("%s%s", consts.SessionRedisPrefix, key)
 }
 }
+
+func (s *sendCode) GetEmailByPhone(ctx context.Context, phone string) (string, error) {
+	user, err := db.GetUserByPhone(ctx, phone)
+	if err != nil {
+		return "", err
+	} else if user == nil {
+		// 账号不存在
+		logrus.Debugf("[SendCode] sendcode fail,phone:%+v", phone)
+		return "账号不存在", errors.New("sendcode fail")
+	}
+	return user.Email, nil
+}