go 发送邮件

问题

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()
}

你可能感兴趣的:(学习,go学习)