我正在尝试使用go创建电子邮件服务。当我尝试通过gmail或office365代码发送电子邮件时,工作正常,但当我尝试通过自定义smtp发送电子邮件时,我得到“535 5.7.0无效的登录名或密码”错误。我知道用户名和密码是正确的,因为我正在与另一个python服务使用相同的密码和用户名,其他服务工作正常。我没有任何自定义SMTP服务器的文档,但我知道SMTP服务器使用TLS我尝试了普通的身份验证,gomailer,smtp。SendMail() 函数,没有 startTLS,但没有任何变化。这是我的代码;func (m *Mail) sendMail(body, to, subject string) bool {env := common.GetEnvironment()mailServer := env.MailServermailUsername := env.MailUsernameSMTP := fmt.Sprintf("%s:%s", mailServer, env.MailPort)auth := LoginAuth(mailUsername, env.MailPassword)tlsconfig := &tls.Config{ ServerName: mailServer,}c, err := smtp.Dial(SMTP)if err != nil { zap.S().Error(err) return false}c.StartTLS(tlsconfig)if err = c.Auth(auth); err != nil { zap.S().Error(err) return false}if err = c.Mail(mailUsername); err != nil { zap.S().Error(err) return false}if err = c.Rcpt(to); err != nil { zap.S().Error(err) return false}w, err := c.Data()if err != nil { zap.S().Error(err) return false}_, err = w.Write([]byte(body))if err != nil { zap.S().Error(err) return false}err = w.Close()if err != nil { zap.S().Error(err) return false}c.Quit()return true}身份验证功能; import ( "errors" "net/smtp")type loginAuth struct { username, password string}func LoginAuth(username, password string) smtp.Auth { return &loginAuth{username, password}}func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { return "LOGIN", []byte(a.username), nil}func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { if more { switch string(fromServer) { case "Username:": return []byte(a.username), nil case "Password:": return []byte(a.password), nil default: return nil, errors.New("unknown from server") } } return nil, nil}感谢您的帮助
2 回答
函数式编程
TA贡献1807条经验 获得超9个赞
您收到的错误肯定是从smtp服务器返回的。smtp 协议支持多种身份验证机制。如果您不确定服务器支持哪些,可以使用以下命令手动调试它。发送到服务器后,它将宣布支持的身份验证机制。然后,您可以尝试手动登录并正确实施。
请注意,某些方法需要对登录名和密码进行编码(base64、md5 等)。openssl s_client -crlf -ign_eof -connect <smtp_host>:<TLS_port>
EHLO
Start()
Next()
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
命令“AUTH LOGIN”不需要用户名参数。
请尝试以下操作,您的身份验证可能会起作用(如果支持)
func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
return "LOGIN", nil, nil
}
- 2 回答
- 0 关注
- 678 浏览
添加回答
举报
0/150
提交
取消