Go 标准库 net/smtp 本身完全支持含 + 号的邮箱地址(如 ),报错“Transaction failed: Illegal semicolon, not in group”实际源于邮件正文头部中错误使用分号(;)分隔收件人,而非加号导致;应统一使用英文逗号(,)分隔多个 To 地址。
go 标准库 `net/smtp` 本身完全支持含 `+` 号的邮箱地址(如 `
在 Go 中使用 net/smtp.SendMail 发送邮件时,+ 符号本身是合法的邮箱本地部分(local-part)字符,符合 RFC 5321/RFC 5322 规范(例如
真正触发 Illegal semicolon, not in group 错误的原因,是你在构造邮件原始字节(msg)时,在 To: 头部字段中误用了分号 ; 分隔多个收件人。SMTP 协议和多数邮件服务器(如 Postfix、Sendmail、Gmail SMTP 等)严格要求:To、Cc、Bcc 等地址列表必须以英文逗号 , 分隔,而非分号 ;。分号在邮件头中具有特殊语义(常用于分组语法或旧式 group: 语法),若出现在非预期位置,将被解析器拒绝并报此错误。
✅ 正确示例(使用逗号):
msg := []byte(
"To: <email>, <email>\r\n" +
"Subject: Welcome to Our Service\r\n" +
"MIME-Version: 1.0\r\n" +
"Content-Type: text/plain; charset=utf-8\r\n" +
"\r\n" +
"Thank you for registering!\r\n",
)
err := smtp.SendMail(
"smtp.gmail.com:587",
auth,
"<email>",
[]string{"<email>", "<email>"},
msg,
)</email></email></email></email></email>
⚠️ 错误示例(分号导致失败):
// ❌ 错误:To 头中使用分号 —— 将触发 "Illegal semicolon, not in group"
msg := []byte("To: <email>;<email>\r\nSubject: ...\r\n\r\nbody")</email></email>
此外,请注意 smtp.SendMail 的第四个参数 to []string 是SMTP RCPT TO 命令的目标地址列表,它与邮件正文中的 To: 头部逻辑独立但需保持一致。建议始终做到:
- to []string 中每个地址均为规范格式(如
),不含显示名; - 邮件正文 To: 头中若需显示名称,应使用 RFC 2822 格式:To: "Alice" >, "Bob" >,但仍必须用逗号分隔;
- 对含 + 的地址(如
),直接传入即可,无需 URL 编码或替换(+ 在邮箱本地部分不是特殊字符,仅在 URL 查询参数中才表示空格)。
? 小技巧:推荐使用 mail.Message 辅助构建邮件头,避免手动拼接错误:
from := mail.Address{Address: "<email>"}
to := []mail.Address{
{Address: "<email>"}, // +号地址完全合法
{Address: "<email>"},
}
header := make(map[string][]string)
header["To"] = []string{to[0].String(), to[1].String()}
header["Subject"] = []string{"Registration Confirmation"}
header["MIME-Version"] = []string{"1.0"}
header["Content-Type"] = []string{"text/plain; charset=utf-8"}
msgBytes := &bytes.Buffer{}
writer := mail.NewWriter(msgBytes)
for k, v := range header {
writer.SetHeader(k, v...)
}
io.WriteString(writer, "Welcome! Your account is ready.\n")
writer.Close()
err := smtp.SendMail(smtpServer, auth, from.Address,
[]string{to[0].Address, to[1].Address},
msgBytes.Bytes())</email></email></email>
总结:遇到 Illegal semicolon, not in group,请立即检查邮件原始字节中所有头部字段(尤其是 To/Cc/Bcc)的地址分隔符——只允许逗号,严禁分号;+ 符号无需任何特殊处理,放心使用。











