调试SMTP连接

时间:2013-10-11 11:47:31

标签: smtp go

我使用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)
        }
}

我知道这是一个非常模糊的问题,但我们非常感谢任何帮助。

1 个答案:

答案 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