golang net / smtp获取smtp服务器响应DSN

时间:2018-10-14 16:35:56

标签: email go smtp

我正在使用golang net / smtp发送邮件

每当我发送到smtp服务器时,都需要捕获服务器的响应 尤其是DSN

例如,我的本地smtp服务器在邮件末尾给出“确定为”的邮件

我需要捕获并记录在日志中

我该怎么做

package main

import (
    "log"
    "net/smtp"
)

func sendEmail(msg []byte) {
    c, err := smtp.Dial("localhost:25")
    if err != nil {
        log.Fatal(err)
    }
    if err := c.Mail("sender@example.org"); err != nil {
        log.Fatal(err)
    }

    if err := c.Rcpt("recipient@example.net"); err != nil {
        log.Fatal(err)
    }
    wc, err := c.Data()
    if err != nil {
        log.Fatal(err)
    }

    _, err = wc.Write(msg)
    if err != nil {
        log.Fatal(err)
    }

    //How do I get the response here ??
    err = wc.Close()
    if err != nil {
        log.Fatal(err)
    }

    err = c.Quit()
    if err != nil {
        log.Fatal(err)
    }
}

1 个答案:

答案 0 :(得分:3)

如评论中所述,您可以使用c.Text.ReadResponse()

package main

import (
    "net/smtp"
)

func sendEmail(msg []byte) (code int, message string, err error) {
    c, err := smtp.Dial("localhost:25")
    if err != nil {
        return
    }
    defer c.Quit() // make sure to quit the Client

    if err = c.Mail("sender@example.org"); err != nil {
        return
    }

    if err = c.Rcpt("recipient@example.net"); err != nil {
        return
    }

    wc, err := c.Data()
    if err != nil {
        return
    }
    defer wc.Close() // make sure WriterCloser gets closed

    _, err = wc.Write(msg)
    if err != nil {
        return
    }

    code, message, err = c.Text.ReadResponse(0)
    return
}

codemessage和任何err现在已传递给调用方,请勿在整个代码中使用log.Fatal,在调用方处理错误。