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...)