问题如上大标题。
我已经知道客户端和服务器之间的SMTP通信过程,但是服务器和服务器之间如何用SMTP通信就不太知道了。
这两者的区别主要是在用户登录的时候,前者使用用户名和密码就行了,后者通过MX记录来查看来访IP是是真实的域名所有者(根据我查到的资料是这样的)。但是RFC821和RFC1869上似乎都没有相关内容。
这是服务器返回的错误 535 Error: authentication failed
相关代码如下
package main
import (
"crypto/tls"
"fmt"
"net/smtp"
)
// SendEmail 发送邮件
func main() {
conn, err := tls.Dial("tcp", "smtp.qq.com:465", nil)
if err != nil {
fmt.Println("ERROR CODE: 1;" + err.Error())
return
}
c, err := smtp.NewClient(conn, "smtp.qq.com")
if err != nil {
fmt.Println("ERROR CODE: 2;" + err.Error())
return
}
err = c.Hello("mail.mydomain.me")
if err != nil {
fmt.Println("ERROR CODE: 3;" + err.Error())
return
}
//****************************猜测问题所在
a := smtp.PlainAuth("", "one@mail.mydomain.me", "", "smtp.qq.com")
err = c.Auth(a)
if err != nil {
fmt.Println("ERROR CODE: 4;" + err.Error())//在这里报错!
return
}
//****************************
err = c.Mail("one@mail.mydomain.me")
if err != nil {
fmt.Println("ERROR CODE: 5;" + err.Error())
return
}
err = c.Rcpt("17xxxxxx05@qq.com")
if err != nil {
fmt.Println("ERROR CODE: 6;" + err.Error())
return
}
w, err := c.Data()
if err != nil {
fmt.Println("ERROR CODE: 7;" + err.Error())
return
}
header := make(map[string]string)
header["From"] = "mydomain.me"
header["TO"] = "17xxxxxx05@qq.com"
header["Subject"] = "TEST"
header["Content-Type"] = "text/html;chartset=UTF-8"
var smtpMsg string
for k, v := range header {
smtpMsg += k + ":" + v + "\r\n"
}
// 将正文拼接
smtpMsg += "\r\n" + "body test"
_, err = w.Write([]byte(smtpMsg))
if err != nil {
fmt.Println("ERROR CODE: 8;" + err.Error())
return
}
err = w.Close()
if err != nil {
fmt.Println("ERROR CODE: 9;" + err.Error())
return
}
err = c.Quit()
if err != nil {
err = c.Close()
if err != nil {
fmt.Println("ERROR CODE: 10;" + err.Error())
return
}
fmt.Println("ERROR CODE: 11;" + err.Error())
return
}
}
我已经设置了相关的DNS解析
这里的
smtp.qq.com
应该是你自建的域名邮箱服务器吧?流程应该是先登录到你自己的邮箱服务器,再进行发送邮件的操作。