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 等)。
我正在尝试使用 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 等)。