英文:
Debugging SMTP connection
问题
我使用Go语言的net/smtp
包发送电子邮件,对于某些邮件来说它工作得很好,但对于其他邮件则不行。我收到一个554 5.5.1 Error: no valid recipients
的错误,但我非常确定我提供了正确的邮件地址。
(最终目标是使net/smtp
适用于所有的邮件收件人。所以对此方面的答案也是可以的)
我该如何调试后台发生的情况?有哪些命令被发送到SMTP服务器并从服务器返回?我想从命令行(telnet)中重放这些命令,以了解更多关于错误的信息。
这是我使用的代码(来自go-wiki):
package main
import (
"bytes"
"log"
"net/smtp"
)
func main() {
// 连接到远程SMTP服务器。
c, err := smtp.Dial("mail.example.com:25")
if err != nil {
log.Fatal(err)
}
// 设置发件人和收件人。
c.Mail("sender@example.org")
c.Rcpt("recipient@example.net")
// 发送邮件正文。
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)
}
}
我知道这是一个非常模糊的问题,但任何帮助都将不胜感激。
英文:
I use go's net/smtp
to send emails, and it works fine for some emails but not for others. I get an 554 5.5.1 Error: no valid recipients
but I am pretty sure I give the correct mail address.
(The ultimate goal is to make the net/smtp
work for all mail recipients. So answers on that are welcome as well)
How can I debug what's going on in the background? What commands are sent to and from the SMTP server? I'd like to replay the commands from the command line (telnet) to get find out more about the error.
This is the code I use (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)
}
}
I know this is a very vague question, but any help is much appreciated.
答案1
得分: 4
经过一些调试,看起来拒绝有效电子邮件地址的服务器需要一个带有正确主机名的EHLO
命令,而不仅仅是默认的localhost
,这在文档中有记录。
所以当我在开头插入这样一行代码时:
c.Hello("example.com") // 在这里使用真实的服务器名称
一切都正常工作。但是(对自己的备注):永远不要在没有适当错误检查的情况下运行代码。这帮助我检查了所有命令的错误,例如:
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
英文:
It looks (after some debugging), that the servers who rejected the valid email addresses require a EHLO
command with a proper hostname, not just localhost
which is the default as documented
So when I insert a line in the beginning like this
c.Hello("example.com") // use real server name here
everything works fine. BUT: (note to myself): never run code without proper error checking. It helped me to check the error on all the commands such as
err = c.Hello("example.com")
...
err = c.Mail("sender@example.org")
...
err = c.Rcpt("recipient@example.net")
...
I am not sure anymore which error message gave me the hint to use a proper hostname, but it was something like:
550 5.7.1 <localhost>: Helo command rejected: Don't use hostname localhost
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论