猿问

Golang SMTP 错误: 535 5.7.0 登录名或密码无效

我正在尝试使用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.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

}

感谢您的帮助


蓝山帝景
浏览 679回答 2
2回答

函数式编程

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

一只名叫tom的猫

命令“AUTH LOGIN”不需要用户名参数。请尝试以下操作,您的身份验证可能会起作用(如果支持)func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {&nbsp; &nbsp; return "LOGIN", nil, nil}
随时随地看视频慕课网APP

相关分类

Go
我要回答