fix(邮件发送): 适配 MailerSend SMTP 并迁移基础设施至 1Panel
Motivation: 将通知服务部署到 1Panel 生产环境,集成 MailerSend 邮件服务,修复 SMTP 协议中 MAIL FROM 命令因携带显示名而导致的发送失败问题。 Changes: * 修复 SMTP MAIL FROM 命令传入带显示名的完整地址导致发送失败的问题,新增 extractEmailAddr 提取裸地址 * 更新 SMTP 配置为 MailerSend 真实凭证,From 地址适配其域名验证要求 * 移除 docker-compose 中内置的 MySQL/Redis 服务,改为依赖外部 1Panel 基础设施 * 更新环境变量为生产环境实际凭据
This commit is contained in:
@@ -91,7 +91,9 @@ func (s *EmailSender) authAndSend(client *smtp.Client, to []string, msg []byte)
|
||||
}
|
||||
}
|
||||
|
||||
if err := client.Mail(s.cfg.From); err != nil {
|
||||
// MAIL FROM must be a bare address; display names like "Name <a@b.c>" are invalid here.
|
||||
fromAddr := extractEmailAddr(s.cfg.From)
|
||||
if err := client.Mail(fromAddr); err != nil {
|
||||
return fmt.Errorf("mail: %w", err)
|
||||
}
|
||||
for _, recipient := range to {
|
||||
@@ -121,3 +123,13 @@ func buildEmail(from string, to []string, subject, body string) []byte {
|
||||
sb.WriteString(body)
|
||||
return []byte(sb.String())
|
||||
}
|
||||
|
||||
// extractEmailAddr returns the bare address from "Name <addr@host>" or the original string.
|
||||
func extractEmailAddr(from string) string {
|
||||
start := strings.LastIndex(from, "<")
|
||||
end := strings.LastIndex(from, ">")
|
||||
if start >= 0 && end > start {
|
||||
return strings.TrimSpace(from[start+1 : end])
|
||||
}
|
||||
return strings.TrimSpace(from)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user