问题
go发送邮件,直接使用smtp库时报如下错误:
x509: certificate signed by unknown authority
原因
可能的原因是正连接的主机返回电脑不能识别的根CA证书,可能是自签署证书或远端的错误配置或者SSL中间人劫持
解决
修改smtp.SendMail到本地工程(注意:不要直接修改net/smtp包中的代码)
func SmtpSendMail(addr string, a smtp.Auth, from string, to []string, msg []byte) error {
//fmt.Print(addr, a, from, to, msg)
c, err := smtp.Dial(addr)
if err != nil {
return err
}
defer c.Close()
// if err = c.hello(); err != nil {
// return err
// }
if ok, _ := c.Extension("STARTTLS"); ok {
host, _, _ := net.SplitHostPort(addr)
config := &tls.Config{InsecureSkipVerify: true, ServerName: host}
// if testHookStartTLS != nil {
// testHookStartTLS(config)
// }
if err = c.StartTLS(config); err != nil {
return err
}
}
// if a != nil && c.ext != nil {
// if _, ok := c.ext["AUTH"]; ok {
if a != nil {
if ok, _ := c.Extension("AUTH"); ok {
if err = c.Auth(a); err != nil {
return err
}
}
}
if err = c.Mail(from); err != nil {
return err
}
for _, addr := range to {
if err = c.Rcpt(addr); err != nil {
return err
}
}
w, err := c.Data()
if err != nil {
return err
}
_, err = w.Write(msg)
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
return c.Quit()
}