Go-Mail多收件人发送失败及表单附件处理问题求助
问题1:多个收件人无法发送的解决方案
你的问题核心是表单数据传递格式与结构体解析逻辑不匹配:
- 当前提交的
sendTo是JSON数组字符串,但默认的表单解析器(如gin、echo等框架的form解析)不会自动将JSON字符串转换为[]string类型。 - 单个邮箱能正常工作,是因为解析器会把单个字符串直接赋值给切片的第一个元素;但JSON数组字符串会被当成切片的单个元素,导致go-mail识别为无效邮箱格式。
两种解决办法:
方法1:调整表单提交格式(推荐)
如果使用multipart/form-data或application/x-www-form-urlencoded提交,直接传递多个同名的sendTo参数:
subject: Notification sendTo: abc@gmail.com sendTo: xyz@gmail.com body: You have been notified
框架的表单解析器会自动将多个sendTo参数解析到[]string类型的EmailTo字段中,之后直接将EmailTo传给go-mail的SetTo方法即可:
msg := mail.NewMsg() if err := msg.SetTo(sendMailBody.EmailTo); err != nil { // 处理错误 }
方法2:手动解析JSON格式的收件人字符串
如果必须传递JSON数组格式的sendTo,需要修改结构体并手动解析:
type SendMailBody struct { EmailTo string `form:"sendTo"` // 先改为string类型 Subject string `form:"subject"` Body string `form:"body"` } // 处理请求时解析JSON字符串 var toList []string if err := json.Unmarshal([]byte(sendMailBody.EmailTo), &toList); err != nil { // 处理解析错误,比如返回参数无效 } // 将解析后的切片传给go-mail msg := mail.NewMsg() if err := msg.SetTo(toList); err != nil { // 处理错误 }
问题2:表单上传附件的处理方法
go-mail提供了AttachReader方法,可直接从io.Reader加载附件,无需先保存到本地文件。以常用的gin框架为例,处理步骤如下:
1. 修改结构体(若使用绑定),添加文件字段
type SendMailBody struct { EmailTo []string `form:"sendTo"` Subject string `form:"subject"` Body string `form:"body"` Attach *multipart.FileHeader `form:"attach"` // 单个附件 // 若支持多个附件,改为:[]*multipart.FileHeader `form:"attach"` }
2. 处理上传文件并添加到邮件
// 绑定表单数据 var body SendMailBody if err := c.ShouldBind(&body); err != nil { // 处理绑定错误 } // 创建邮件 msg := mail.NewMsg() // 设置收件人、主题、正文... // 处理单个附件 if body.Attach != nil { file, err := body.Attach.Open() if err != nil { // 处理文件打开错误 } defer file.Close() // 用AttachReader添加附件,参数为文件名和文件读取器 if err := msg.AttachReader(body.Attach.Filename, file); err != nil { // 处理添加附件错误 } } // 处理多个附件的逻辑 // for _, fh := range body.Attachs { // file, err := fh.Open() // if err != nil { /* 处理错误 */ } // defer file.Close() // if err := msg.AttachReader(fh.Filename, file); err != nil { /* 处理错误 */ } // } // 发送邮件 // client.DialAndSend(msg)
内容的提问来源于stack exchange,提问作者Krawly
相关产品推荐
相关产品推荐

