diff --git a/routers/api/v2/send_message.go b/routers/api/v2/send_message.go index a34e9bb..7537bdb 100644 --- a/routers/api/v2/send_message.go +++ b/routers/api/v2/send_message.go @@ -18,6 +18,7 @@ type SendMessageByTemplateReq struct { Token string `json:"token" validate:"required" label:"模板token"` Title string `json:"title" validate:"required" label:"消息标题"` Placeholders map[string]interface{} `json:"placeholders" label:"占位符"` + Recipients []string `json:"recipients" label:"接收者列表"` } // DoSendMessageByTemplate 使用模板发送消息 @@ -111,6 +112,7 @@ func DoSendMessageByTemplate(c *gin.Context) { AtMobiles: atMobiles, AtUserIds: atUserIds, AtAll: template.IsAtAll, + Recipients: req.Recipients, // 动态接收者列表 DefaultLogger: logrus.WithFields(logrus.Fields{ "prefix": "[Template Send]", }), diff --git a/service/send_ins_service/send_ins.go b/service/send_ins_service/send_ins.go index 62dfe43..ec2832d 100644 --- a/service/send_ins_service/send_ins.go +++ b/service/send_ins_service/send_ins.go @@ -29,20 +29,24 @@ func (sw *SendTaskInsService) ValidateDiffIns(ins models.SendTasksIns) (string, if err != nil { return "邮箱auth反序列化失败!", empty } - + // 检查是否为动态接收者模式 var configMap map[string]interface{} json.Unmarshal([]byte(ins.Config), &configMap) allowMultiRecip, exists := configMap["allowMultiRecip"].(bool) - - // allowMultiRecip=true为动态模式,to_account可以为空 - // 历史数据(不存在allowMultiRecip字段)默认为固定模式 - if exists && allowMultiRecip && emailConfig.ToAccount == "" { - // 动态模式,不验证to_account - return "", emailConfig + + // allowMultiRecip=true为动态模式,to_account可以为空(但如果有值也要验证格式) + if exists && allowMultiRecip { + // 动态模式:如果to_account为空,直接返回;如果有值,验证邮箱格式 + if emailConfig.ToAccount == "" { + return "", emailConfig + } + // 有to_account值时,验证邮箱格式 + _, Msg := app.CommonPlaygroundValid(emailConfig) + return Msg, emailConfig } - - // 固定模式或有to_account时,进行常规验证 + + // 固定模式:必须验证to_account _, Msg := app.CommonPlaygroundValid(emailConfig) return Msg, emailConfig } @@ -77,19 +81,19 @@ func (sw *SendTaskInsService) ValidateDiffIns(ins models.SendTasksIns) (string, if err != nil { return "微信公众号发送配置反序列化失败!", empty } - + // 检查是否为动态接收者模式 var configMap map[string]interface{} json.Unmarshal([]byte(ins.Config), &configMap) allowMultiRecip, exists := configMap["allowMultiRecip"].(bool) - + // allowMultiRecip=true为动态模式,to_account可以为空 // 历史数据(不存在allowMultiRecip字段)默认为固定模式 if exists && allowMultiRecip && Config.ToAccount == "" { // 动态模式,不验证to_account return "", Config } - + // 固定模式或有to_account时,进行常规验证 _, Msg := app.CommonPlaygroundValid(Config) return Msg, Config @@ -100,12 +104,12 @@ func (sw *SendTaskInsService) ValidateDiffIns(ins models.SendTasksIns) (string, if err != nil { return "阿里云短信配置反序列化失败!", empty } - + // 检查是否为动态接收者模式 var configMap map[string]interface{} json.Unmarshal([]byte(ins.Config), &configMap) allowMultiRecip, exists := configMap["allowMultiRecip"].(bool) - + // allowMultiRecip=true为动态模式,phone_number可以为空,但template_code仍需验证 if exists && allowMultiRecip && Config.PhoneNumber == "" { // 动态模式,只验证template_code @@ -114,7 +118,7 @@ func (sw *SendTaskInsService) ValidateDiffIns(ins models.SendTasksIns) (string, } return "", Config } - + // 固定模式或有phone_number时,进行常规验证 _, Msg := app.CommonPlaygroundValid(Config) return Msg, Config diff --git a/service/send_message_service/send_message.go b/service/send_message_service/send_message.go index 8a26315..f843a33 100644 --- a/service/send_message_service/send_message.go +++ b/service/send_message_service/send_message.go @@ -261,6 +261,11 @@ func (sm *SendMessageService) Send(task models.TaskIns) (string, error) { // 处理动态接收者(邮箱、微信公众号等支持群发的渠道) isDynamicMode := sm.isDynamicRecipientMode(ins.SendTasksIns) + // 检查:如果提供了recipients但实例未启用动态模式,给出提示 + if !isDynamicMode && sm.supportsDynamicRecipient(way.Type) && len(sm.Recipients) > 0 { + sm.LogsAndStatusMark(fmt.Sprintf("警告:提供了 %d 个接收者,但实例未启用动态接收模式(allowMultiRecip=true),将使用实例配置的固定接收者", len(sm.Recipients)), sm.Status) + } + if isDynamicMode && sm.supportsDynamicRecipient(way.Type) && len(sm.Recipients) > 0 { // 动态接收模式:使用API传入的Recipients列表(群发) sm.LogsAndStatusMark(fmt.Sprintf("动态接收模式[共 %d 个接收者]", len(sm.Recipients)), sm.Status) diff --git a/service/send_message_service/unified/channels/email.go b/service/send_message_service/unified/channels/email.go index e0ff5ea..2837e55 100644 --- a/service/send_message_service/unified/channels/email.go +++ b/service/send_message_service/unified/channels/email.go @@ -28,6 +28,11 @@ func (c *EmailChannel) SendUnified(msgObj interface{}, ins models.SendTasksIns, if !ok { return "", "邮箱config校验失败" } + + if config.ToAccount == "" { + return "", "收件邮箱地址为空,请检查实例配置或启用动态接收模式" + } + contentType, formattedContent, err := c.FormatContent(content) if err != nil { return "", err.Error()