From 60fa5df1de3e8887a34baa6f84dddf3872346a3a Mon Sep 17 00:00:00 2001 From: eson <9673575+githubcontent@user.noreply.gitee.com> Date: Thu, 31 Aug 2023 12:20:05 +0800 Subject: [PATCH] fix --- server/auth/internal/logic/email_manager.go | 31 ++++++++++++------- .../internal/logic/useremailregisterlogic.go | 1 + .../auth/internal/logic/userregisterlogic.go | 1 + 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/server/auth/internal/logic/email_manager.go b/server/auth/internal/logic/email_manager.go index 08b03a28..5a5eaf50 100644 --- a/server/auth/internal/logic/email_manager.go +++ b/server/auth/internal/logic/email_manager.go @@ -8,14 +8,17 @@ import ( "sync" "text/template" "time" + + "github.com/zeromicro/go-zero/core/logx" ) +var EmailTaskResendTime = time.Second * 30 var TimeLimit *check.TimeLimit[string] var EmailManager *EmailSender func init() { - TimeLimit = check.NewTimelimit[string](time.Second * 25) + TimeLimit = check.NewTimelimit[string](EmailTaskResendTime) // Initialize the email manager EmailManager = &EmailSender{ @@ -28,8 +31,8 @@ func init() { ), FromEmail: "support@fusenpack.com", emailSending: make(map[string]*EmailTask, 10), - ResendTimeLimit: time.Minute * 1, - semaphore: make(chan struct{}, 10), // Initialize semaphore with a capacity of 10 + ResendTimeLimit: EmailTaskResendTime, + semaphore: make(chan struct{}, 100), // Initialize semaphore with a capacity of 10 } // Start processing email tasks @@ -40,6 +43,7 @@ func init() { } type EmailFormat struct { + UniqueKey string // 用于处理唯一的任务,重发都会被利用到 TargetEmail string // 发送的目标email CompanyName string // fs公司名 ConfirmationLink string // fs确认连接 @@ -73,14 +77,19 @@ func (m *EmailSender) ProcessEmailTasks() { break } + if emailformat.UniqueKey == "" { + logx.Error("email UniqueKey must be exists") + continue + } + m.lock.Lock() - _, isSending := m.emailSending[emailformat.TargetEmail] + _, isSending := m.emailSending[emailformat.UniqueKey] if isSending { m.lock.Unlock() continue } - m.emailSending[emailformat.TargetEmail] = &EmailTask{ + m.emailSending[emailformat.UniqueKey] = &EmailTask{ Email: emailformat, SendTime: time.Now().UTC(), } @@ -96,26 +105,26 @@ func (m *EmailSender) ProcessEmailTasks() { err := smtp.SendMail("smtp.gmail.com:587", m.Auth, m.FromEmail, []string{emailformat.TargetEmail}, content) if err != nil { log.Printf("Failed to send email to %s: %v\n", emailformat, err) - m.Resend(emailformat.TargetEmail, content) + m.Resend(emailformat.UniqueKey, content) } }() } } // Resend 重发邮件 -func (m *EmailSender) Resend(emailTarget string, content []byte) { +func (m *EmailSender) Resend(uniqueKey string, content []byte) { time.Sleep(m.ResendTimeLimit) m.lock.Lock() defer m.lock.Unlock() // Check if the email task still exists and has not been sent successfully - if task, ok := m.emailSending[emailTarget]; ok && task.SendTime.Add(m.ResendTimeLimit).After(time.Now().UTC()) { - err := smtp.SendMail(emailTarget, m.Auth, m.FromEmail, []string{emailTarget}, content) + if task, ok := m.emailSending[uniqueKey]; ok && task.SendTime.Add(m.ResendTimeLimit).After(time.Now().UTC()) { + err := smtp.SendMail(task.Email.TargetEmail, m.Auth, m.FromEmail, []string{task.Email.TargetEmail}, content) if err != nil { - log.Printf("Failed to resend email to %s: %v\n", emailTarget, err) + log.Printf("Failed to resend email to %s: %v\n", task.Email.TargetEmail, err) } else { - delete(m.emailSending, emailTarget) + delete(m.emailSending, uniqueKey) } } } diff --git a/server/auth/internal/logic/useremailregisterlogic.go b/server/auth/internal/logic/useremailregisterlogic.go index 1de536f0..487fdf74 100644 --- a/server/auth/internal/logic/useremailregisterlogic.go +++ b/server/auth/internal/logic/useremailregisterlogic.go @@ -74,6 +74,7 @@ func (l *UserEmailRegisterLogic) UserEmailRegister(req *types.RequestEmailRegist // 进入发送邮箱的系统 EmailManager.EmailTasks <- &EmailFormat{ + UniqueKey: "register-" + req.Email, TargetEmail: req.Email, CompanyName: "fusen", ConfirmationLink: clurl, diff --git a/server/auth/internal/logic/userregisterlogic.go b/server/auth/internal/logic/userregisterlogic.go index a813c66f..0ae610dc 100644 --- a/server/auth/internal/logic/userregisterlogic.go +++ b/server/auth/internal/logic/userregisterlogic.go @@ -74,6 +74,7 @@ func (l *UserRegisterLogic) UserRegister(req *types.RequestUserRegister, userinf // 进入发送邮箱的系统 EmailManager.EmailTasks <- &EmailFormat{ + UniqueKey: "register-" + req.Email, TargetEmail: req.Email, CompanyName: "fusen", ConfirmationLink: clurl,