我运行一个电子邮件服务器,桌面客户端可以通过 SSL/TLS 连接并毫无问题地发送电子邮件。但是,我还没有使用 相同的凭据 在 Go 中这样做。
import (
"fmt"
"log"
"net/mail"
"net/smtp"
"os"
"crypto/tls"
"github.com/joho/godotenv"
)
func init() {
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
smtpHost = os.Getenv("EMAIL_SERVER_SMTP_HOST")
//465
smtpPort = os.Getenv("EMAIL_SERVER_SMTP_PORT")
//.........
}
func sendEmail(to mail.Address, subject string, body string) (string, error) {
headers := make(map[string]string)
newUuid, err := uuid.NewRandom()
headers["Message-ID"] = newUuid.String()
headers["From"] = from.String()
headers["To"] = to.String()
headers["Subject"] = subject
// Setup message
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + body
auth := smtp.PlainAuth("", userLogin, userPassword, smtpHost)
// TLS config
tlsConfig := &tls.Config{
InsecureSkipVerify: false,
ServerName: smtpHost,
}
conn, err := tls.Dial("tcp", serverName, tlsConfig)
if err != nil {
log.Panic(err)
}
c, err := smtp.NewClient(conn, smtpHost)
if err != nil {
log.Panic(err)
}
//!!! error here
if err = c.Auth(auth); err != nil {
log.Panic(err)
}
//.........
c.Quit()
return msgId, nil
}
错误
panic: 535 5.7.8 Error: authentication failed:
在服务器的日志中,除此之外没有其他信息。
所有凭据都从“.env”中正确读取。
怎么了?
通常使用 SMTP,你会使用
smtp.Dial
然后 c.StartTLS
,即这样做:
auth := smtp.PlainAuth("", userLogin, userPassword, smtpHost)
tlsconfig := &tls.Config {
InsecureSkipVerify: false,
ServerName: smtpHost,
}
c, err := smtp.Dial(servername)
if err != nil {
log.Panic(err)
}
err = c.StartTLS(tlsconfig)
if err != nil {
log.Panic(err)
}
err = c.Auth(auth)
if err != nil {
log.Panic(err)
}