feat: 添加存储配置管理功能

- 添加存储配置管理页面(列表、创建、编辑)
- 支持本地存储、S3、WebDAV、FTP、SFTP 等存储类型
- 添加存储配置测试连接功能
- 本地存储自动初始化且禁止删除
- 修复 Switch 组件状态显示问题
- 添加更新存储配置时的 status 字段支持
This commit is contained in:
2026-05-02 17:48:58 +08:00
parent ea8ffb6c74
commit 9b82fbef4e
35 changed files with 5425 additions and 21 deletions
+60 -4
View File
@@ -41,14 +41,14 @@ func (s *EmailService) SendEmail(config EmailConfig, to, subject, body string) e
auth := smtp.PlainAuth("", config.User, config.Password, config.Host)
if config.UseSSL || config.Port == 465 || config.Port == 587 {
return s.sendWithTLS(addr, auth, from, []string{to}, []byte(msg))
if config.Port == 465 || config.UseSSL {
return s.sendWithImplicitTLS(addr, auth, from, []string{to}, []byte(msg))
}
return smtp.SendMail(addr, auth, from, []string{to}, []byte(msg))
return s.sendWithSTARTTLS(addr, auth, from, []string{to}, []byte(msg))
}
func (s *EmailService) sendWithTLS(addr string, auth smtp.Auth, from string, to []string, msg []byte) error {
func (s *EmailService) sendWithImplicitTLS(addr string, auth smtp.Auth, from string, to []string, msg []byte) error {
host := strings.Split(addr, ":")[0]
tlsConfig := &tls.Config{
@@ -99,6 +99,62 @@ func (s *EmailService) sendWithTLS(addr string, auth smtp.Auth, from string, to
return client.Quit()
}
func (s *EmailService) sendWithSTARTTLS(addr string, auth smtp.Auth, from string, to []string, msg []byte) error {
host := strings.Split(addr, ":")[0]
client, err := smtp.Dial(addr)
if err != nil {
return fmt.Errorf("连接SMTP服务器失败: %v", err)
}
defer client.Close()
if err = client.Hello("localhost"); err != nil {
return fmt.Errorf("HELO命令失败: %v", err)
}
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
if ok, _ := client.Extension("STARTTLS"); ok {
if err = client.StartTLS(tlsConfig); err != nil {
return fmt.Errorf("STARTTLS失败: %v", err)
}
}
if err = client.Auth(auth); err != nil {
return fmt.Errorf("SMTP认证失败: %v", err)
}
if err = client.Mail(from); err != nil {
return fmt.Errorf("设置发件人失败: %v", err)
}
for _, addr := range to {
if err = client.Rcpt(addr); err != nil {
return fmt.Errorf("设置收件人失败: %v", err)
}
}
w, err := client.Data()
if err != nil {
return fmt.Errorf("准备邮件数据失败: %v", err)
}
_, err = w.Write(msg)
if err != nil {
return fmt.Errorf("写入邮件内容失败: %v", err)
}
err = w.Close()
if err != nil {
return fmt.Errorf("关闭邮件写入失败: %v", err)
}
return client.Quit()
}
func (s *EmailService) buildMessage(fromName, from, to, subject, body string) string {
msg := ""