You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:01:05