diff --git a/models/migration.go b/models/migration.go index 062cd07..b990171 100644 --- a/models/migration.go +++ b/models/migration.go @@ -88,7 +88,6 @@ func addDefaultSettings() { {Name: "replyTo", Value: `abslant@126.com`, Type: "mail"}, {Name: "smtpUser", Value: `no-reply@acg.blue`, Type: "mail"}, {Name: "smtpPass", Value: ``, Type: "mail"}, - {Name: "encriptionType", Value: `no`, Type: "mail"}, {Name: "over_used_template", Value: `容量超额提醒
容量超额警告
亲爱的{userName}
由于{notifyReason},您在{siteTitle}的账户的容量使用超出配额,您将无法继续上传新文件,请尽快清理文件,否则我们将会禁用您的账户。
登录{siteTitle}
感谢您选择{siteTitle}。
`, Type: "mail_template"}, {Name: "ban_time", Value: `10`, Type: "storage_policy"}, diff --git a/pkg/email/init.go b/pkg/email/init.go index 7df5cbe..c90a4cf 100644 --- a/pkg/email/init.go +++ b/pkg/email/init.go @@ -1,12 +1,23 @@ package email -import model "github.com/HFO4/cloudreve/models" +import ( + model "github.com/HFO4/cloudreve/models" + "github.com/HFO4/cloudreve/pkg/util" + "sync" +) // Client 默认的邮件发送客户端 var Client Driver +// Lock 读写锁 +var Lock sync.RWMutex + // Init 初始化 func Init() { + util.Log().Debug("邮件队列初始化") + Lock.Lock() + defer Lock.Unlock() + if Client != nil { Client.Close() } diff --git a/pkg/email/mail.go b/pkg/email/mail.go index 375adc1..01cc690 100644 --- a/pkg/email/mail.go +++ b/pkg/email/mail.go @@ -27,6 +27,9 @@ func Send(to, title, body string) error { return nil } + Lock.RLock() + defer Lock.RUnlock() + if Client == nil { return ErrNoActiveDriver } diff --git a/pkg/email/smtp.go b/pkg/email/smtp.go index f455ba2..0da1033 100644 --- a/pkg/email/smtp.go +++ b/pkg/email/smtp.go @@ -45,7 +45,8 @@ func (client *SMTP) Send(to, title, body string) error { return ErrChanNotOpen } m := mail.NewMessage() - m.SetHeader("From", client.Config.Address) + m.SetAddressHeader("From", client.Config.Address, client.Config.Name) + m.SetAddressHeader("Reply-To", client.Config.ReplyTo, client.Config.Name) m.SetHeader("To", to) m.SetHeader("Subject", title) m.SetBody("text/html", body) @@ -66,8 +67,8 @@ func (client *SMTP) Init() { defer func() { if err := recover(); err != nil { client.chOpen = false - util.Log().Error("邮件发送队列出现异常, %s ,30 秒后重新连接", err) - time.Sleep(time.Duration(30) * time.Second) + util.Log().Error("邮件发送队列出现异常, %s ,10 秒后重置", err) + time.Sleep(time.Duration(10) * time.Second) client.Init() } }() @@ -83,6 +84,7 @@ func (client *SMTP) Init() { select { case m, ok := <-client.ch: if !ok { + util.Log().Debug("邮件队列关闭") client.chOpen = false return } diff --git a/routers/controllers/admin.go b/routers/controllers/admin.go index 434e244..a0cbfb5 100644 --- a/routers/controllers/admin.go +++ b/routers/controllers/admin.go @@ -1,6 +1,7 @@ package controllers import ( + "github.com/HFO4/cloudreve/pkg/email" "github.com/HFO4/cloudreve/pkg/request" "github.com/HFO4/cloudreve/pkg/serializer" "github.com/HFO4/cloudreve/service/admin" @@ -63,7 +64,20 @@ func AdminGetGroups(c *gin.Context) { func AdminReloadService(c *gin.Context) { service := c.Param("service") switch service { + case "email": + email.Init() } c.JSON(200, serializer.Response{}) } + +// AdminSendTestMail 发送测试邮件 +func AdminSendTestMail(c *gin.Context) { + var service admin.MailTestService + if err := c.ShouldBindJSON(&service); err == nil { + res := service.Send() + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} diff --git a/routers/router.go b/routers/router.go index d676f75..e9dae1d 100644 --- a/routers/router.go +++ b/routers/router.go @@ -301,6 +301,8 @@ func InitMasterRouter() *gin.Engine { admin.GET("groups", controllers.AdminGetGroups) // 重新加载子服务 admin.GET("reload/:service", controllers.AdminReloadService) + // 重新加载子服务 + admin.POST("mailTest", controllers.AdminSendTestMail) } // 用户 diff --git a/service/admin/site.go b/service/admin/site.go index 4b03e19..c611987 100644 --- a/service/admin/site.go +++ b/service/admin/site.go @@ -4,6 +4,7 @@ import ( model "github.com/HFO4/cloudreve/models" "github.com/HFO4/cloudreve/pkg/cache" "github.com/HFO4/cloudreve/pkg/conf" + "github.com/HFO4/cloudreve/pkg/email" "github.com/HFO4/cloudreve/pkg/serializer" "time" ) @@ -28,6 +29,19 @@ type BatchSettingGet struct { Keys []string `json:"keys"` } +// MailTestService 邮件测试服务 +type MailTestService struct { + Email string `json:"to" binding:"email"` +} + +// Send 发送测试邮件 +func (service *MailTestService) Send() serializer.Response { + if err := email.Send(service.Email, "Cloudreve发信测试", "这是一封测试邮件,用于测试 Cloudreve 发信设置。"); err != nil { + return serializer.Err(serializer.CodeInternalSetting, "发信失败, "+err.Error(), nil) + } + return serializer.Response{} +} + // Get 获取设定值 func (service *BatchSettingGet) Get() serializer.Response { options := model.GetSettingByNames(service.Keys...)