Go可用net/smtp发信、go-imap收信,需正确选协议端口、用标准Auth类型、设HTML头与CRLF换行、环境变量存密;收信须TLS加密、Gmail配应用密码;错误要细判状态码并分类重试。
Go 本身不内置邮件服务器,但用标准库 net/smtp 和第三方包(如 github.com/emersion/go-imap)能可靠实现发信与基础收信——关键不在“能不能”,而在“怎么选协议、配什么服务、绕开哪些坑”。
用 net/smtp 发邮件:别硬写认证逻辑,直接复用 smtp.Auth
很多人自己拼 Auth 字符串或手写 CRAM-MD5,其实 Go 标准库已封装好主流方式。Gmail、Outlook、阿里云邮箱等都支持 PLAIN 或 LOGIN 认证,直接调用现成类型即可。
常见错误:传错 host:port(比如 Gmail 用 smtp.gmail.com:587,不是 :465;而某些企业邮箱只认 :465 TLS 直连)。
-
smtp.PlainAuth最通用,参数顺序是identity, username, password, host,identity通常为空字符串 - 发 HTML 邮件时,必须设
Content-Type: text/html; charset=utf-8,且换行用\r\n(不是\n),否则 Outlook 可能渲染异常 - 避免在生产环境硬编码密码:改用环境变量读取
os.Getenv("SMTP_PASSWORD"),或通过配置中心注入
收邮件别碰原始 net/textproto,优先用 go-imap + go-imap-idle
IMAP 协议状态多、响应格式松散,自己解析 FETCH 响应极易出错(比如乱码、BODYSTRUCTURE 解析失败、UID 溢出)。社区成熟的 github.com/emersion/go-imap 封装了连接、认证、文件夹选择、消息抓取全流程。