Golang SMTP error: 535 5.7.0 Invalid login or password

Golang SMTP error: 535 5.7.0 Invalid login or password

我正在尝试使用 go 创建电子邮件服务。 当我尝试通过 gmail 或 office365 代码发送电子邮件时工作正常但是当我尝试通过自定义 smtp 发送电子邮件时我收到“535 5.7.0 无效登录名或密码”错误。

我知道用户名和密码是正确的,因为我在另一个 python 服务中使用相同的密码和用户名,flask-mail 和其他服务工作正常。

我没有自定义 smtp 服务器的任何文档,但我知道 smtp 服务器使用 TLS

我尝试了简单的 auth、gomailer、smtp.SendMail() 函数并且没有使用 startTLS,但没有任何改变。

这是我的代码;

func (m *Mail) sendMail(body, to, subject string) bool {
env := common.GetEnvironment()
mailServer := env.MailServer
mailUsername := env.MailUsername

SMTP := 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
}

感谢您的帮助

你得到的错误肯定是smtp服务器返回的。 smtp 协议支持多种身份验证机制。如果您不确定您的服务器支持哪些,您可以使用以下命令手动调试它 openssl s_client -crlf -ign_eof -connect <smtp_host>:<TLS_port>。 向服务器发送 EHLO 后,它将宣布支持的身份验证机制。那么您可以尝试手动登录并正确实现Start()Next()
请注意,某些方法需要对登录名和密码进行编码(base64、md5 等)。