我使用go net/smtp
发送电子邮件,它适用于某些电子邮件但不适用于其他电子邮件。我得到554 5.5.1 Error: no valid recipients
,但我很确定我提供了正确的邮件地址。
(最终目标是让net/smtp
适用于所有邮件收件人。因此,欢迎提供答案)
如何调试后台正在进行的操作?什么命令发送到SMTP服务器和从SMTP服务器发送?我想重播命令行(telnet)中的命令,以了解有关错误的更多信息。
这是我使用的代码(from the go-wiki):
package main
import (
"bytes"
"log"
"net/smtp"
)
func main() {
// Connect to the remote SMTP server.
c, err := smtp.Dial("mail.example.com:25")
if err != nil {
log.Fatal(err)
}
// Set the sender and recipient.
c.Mail("sender@example.org")
c.Rcpt("recipient@example.net")
// Send the email body.
wc, err := c.Data()
if err != nil {
log.Fatal(err)
}
defer wc.Close()
buf := bytes.NewBufferString("This is the email body.")
if _, err = buf.WriteTo(wc); err != nil {
log.Fatal(err)
}
}
我知道这是一个非常模糊的问题,但我们非常感谢任何帮助。
答案 0 :(得分:4)
看起来(在一些调试之后),拒绝有效电子邮件地址的服务器需要EHLO
命令以及正确的主机名,而不只是localhost
,默认为documented
所以当我在开头插入一行像这样
c.Hello("example.com") // use real server name here
一切正常。 但是:(请注意自己):如果没有正确的错误检查,请不要运行代码。它帮助我检查所有命令的错误,如
err = c.Hello("example.com")
...
err = c.Mail("sender@example.org")
...
err = c.Rcpt("recipient@example.net")
...
我不确定哪个错误消息给了我提示使用正确的主机名,但它是这样的:
550 5.7.1 <localhost>: Helo command rejected: Don't use hostname localhost