Scert/backend/internal/config/notification_sender.go
xuans 7d83fbc093
Some checks failed
Build and Release / Build Release Package (tar.gz, amd64, linux) (push) Has been cancelled
Build and Release / Build Release Package (tar.gz, arm64, linux) (push) Has been cancelled
Build and Release / Build Release Package (zip, amd64, windows) (push) Has been cancelled
fix: 遵循用户发件人原样配置不篡改发信地址并升级版本号至v1.52.3
2026-10-18 22:08:54 +08:00

59 lines
2.0 KiB
Go

package config
import (
"errors"
"net/mail"
"strings"
)
// UsesSmailSystemAccount 判断通知账号是否为 Smail 系统通知账号。
func (c NotificationConfig) UsesSmailSystemAccount() bool {
return strings.HasPrefix(strings.ToLower(strings.TrimSpace(c.SMTPUsername)), "notify:")
}
// SenderIdentity 根据用户配置或通知账号确定发件人。
// 遵循“用户怎么填就用什么”的原则,原样使用用户填写的发件人或发信账号,不擅自拼接或篡改发信地址。
func (c NotificationConfig) SenderIdentity() (string, string, error) {
name := strings.TrimSpace(c.SenderName)
email := strings.TrimSpace(c.SenderEmail)
if !c.SMTPEnabled {
return name, email, nil
}
// 如果用户明确填写了发件人邮箱,则原样优先使用
if email != "" {
parsed, err := mail.ParseAddress(email)
if err != nil || parsed.Address != email {
return "", "", errors.New("发件人邮箱地址格式无效")
}
if name == "" {
name = "Scert"
}
return name, email, nil
}
username := strings.ToLower(strings.TrimSpace(c.SMTPUsername))
if c.UsesSmailSystemAccount() {
account := strings.TrimPrefix(username, "notify:")
parsed, err := mail.ParseAddress(account)
parts := strings.Split(account, "@")
if err != nil || parsed.Address != account || parsed.Name != "" || len(parts) != 2 ||
strings.ContainsAny(account, "\r\n<>()") {
return "", "", errors.New("Smail 系统通知用户名必须使用 notify:账号@邮件域名 格式")
}
// 用户未单独指定发件人邮箱时,原样使用 notify: 后的账号邮箱地址,发件人名称优先使用用户配置的 SenderName
if name == "" {
name = "系统通知"
}
return name, account, nil
}
parsed, err := mail.ParseAddress(username)
if err != nil || parsed.Address != username || parsed.Name != "" {
return "", "", errors.New("请填写 Smail 系统通知用户名;兼容 SMTP 账号必须是完整邮箱地址")
}
if name == "" {
name = "Scert"
}
return name, username, nil
}