48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package validation
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
var ErrNotificationRecipient = errors.New("notification address does not accept mail")
|
|
|
|
// notification 为系统专属发信账号,禁止普通用户占用,且拒收任何外部来信。
|
|
const (
|
|
NotificationLocalPart = "notification"
|
|
)
|
|
|
|
func NotificationAddress(domain string) string {
|
|
if domain == "" {
|
|
return ""
|
|
}
|
|
return NotificationLocalPart + "@" + domain
|
|
}
|
|
|
|
func IsNotificationAddress(address string, domains []string) bool {
|
|
parts := strings.Split(strings.ToLower(strings.TrimSpace(address)), "@")
|
|
if len(parts) != 2 {
|
|
return false
|
|
}
|
|
if parts[0] != NotificationLocalPart {
|
|
return false
|
|
}
|
|
for _, domain := range domains {
|
|
if strings.EqualFold(parts[1], domain) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func IsAuthorizedNotificationSender(address, domain string) bool {
|
|
if domain == "" {
|
|
return false
|
|
}
|
|
parts := strings.Split(strings.ToLower(strings.TrimSpace(address)), "@")
|
|
if len(parts) != 2 || !strings.EqualFold(parts[1], domain) {
|
|
return false
|
|
}
|
|
return parts[0] == NotificationLocalPart
|
|
}
|