QQ邮箱授权码必须关闭「独立密码」才能生效,否则即使账号密码端口正确也会静默失败;配置需严格匹配JSON字段名与类型,To必须为字符串切片,From须与username一致,且务必检查err并记录。

QQ邮箱授权码必须关掉「独立密码」才能用
很多开发者填对了账号、密码、端口,Send() 却静默失败或返回 auth: failed to authenticate,根本原因就是 QQ 邮箱开了「独立密码」——它会直接让授权码失效。哪怕你刚生成了 16 位授权码,只要独立密码处于开启状态,SMTP 认证就通不过。
操作路径:登录 QQ 邮箱网页 → 设置 → 账户 → 找到「独立密码」→ 点击「关闭」→ 返回「POP3/IMAP/SMTP/Exchange」页面 → 重新开启 SMTP 并完成密保验证 → 获取新授权码
注意:授权码只显示一次,复制后立刻保存;改过 QQ 密码,授权码也会立即过期。
JSON 配置字段名和类型必须严格匹配
utils.NewEMail() 接收一个 JSON 字符串,但不校验字段合法性。拼错字段(比如写成 "passwd"、"smtp_host" 或把 port 写成字符串 "587")会导致连接被拒,错误提示往往只有泛化的 connection refused 或直接 panic。
立即学习“go语言免费学习笔记(深入)”;
必需字段仅四个,且类型固定:
-
username:完整邮箱地址,字符串,如"test@qq.com" -
password:16 位纯字母数字授权码(不是登录密码),字符串 -
host:SMTP 域名,字符串,如"smtp.qq.com" -
port:整数,不是字符串,推荐587(STARTTLS);避免用465(SSL 模式在 Beego utils 中支持不稳定)
正确示例:{"username":"test@qq.com","password":"abcd1234efgh5678","host":"smtp.qq.com","port":587}
To 必须是 []string,From 必须与 username 一致
emailConn.To = "user@example.com" 看似自然,但会 panic —— Beego 强制要求 To 是切片类型。哪怕只发给一个人,也得写成 []string{"user@example.com"}。
From 是字符串,但必须和配置里的 username 完全一致,否则 QQ 邮箱网关会直接拒收(尤其在企业环境或反垃圾策略较严时)。
其他要点:
- 正文至少填
Text或HTML其中一个,都为空会返回empty body错误 -
emailConn.From不设或设错,邮件可能进垃圾箱甚至被拦截 - 发送前务必检查
err,用beego.Error()或独立 logger 输出,否则失败无声无息
别共用 BeeLogger,邮件和短信日志要物理隔离
真实项目里邮件和短信通知常并存,但 Beego 的 beego.BeeLogger 是全局单例。如果邮件模块和短信模块都往它里面打日志,level 设置会互相干扰(比如短信设了 LevelError,连邮件的 Debug 信息也看不到了)。
正确做法是为每类通知建独立 logger:
- 邮件日志:
emailLog := logs.NewLogger(1000),设置引擎名为"email" - 短信日志:
smsLog := logs.NewLogger(1000),引擎名为"sms" - 发送前记录上下文:
emailLog.Info("to:", email, "subject:", subject) - 失败时带 err 输出:
emailLog.Error("send failed:", err)
最易被忽略的是:Beego 的邮件发送不是开箱即用的服务,它本质是 utils.EMail + 外部 SMTP 的手动胶水层,任何一环(授权码、端口、TLS、字段名、类型、From 一致性、日志捕获)出问题,都可能表现为“没反应”或泛化错误。调试时得逐项确认,不能只盯着代码逻辑。


















