4

我使用 go'snet/smtp发送电子邮件,它适用于某些电子邮件,但不适用于其他电子邮件。我收到了,554 5.5.1 Error: no valid recipients但我很确定我提供了正确的邮件地址。

(最终目标是使net/smtp所有邮件收件人都能正常工作。因此也欢迎对此的回答)

如何调试后台发生的事情?向 SMTP 服务器发送和从 SMTP 服务器发送哪些命令?我想从命令行(telnet)重播命令以了解有关错误的更多信息。

这是我使用的代码(来自 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)
        }
}

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

4

1 回答 1

4

看起来(经过一些调试),拒绝有效电子邮件地址的服务器需要EHLO具有正确主机名的命令,而不仅仅是记录localhost的默认值

所以当我像这样在开头插入一行时

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
于 2013-10-11T13:17:02.497 回答