golang net / smtp получение ответа сервера smtp DSN - PullRequest
0 голосов
/ 14 октября 2018

Я использую golang net / smtp для отправки почты

Когда я отправляю на свой SMTP-сервер, мне нужно перехватить ответ от сервера, особенно DSN

Например, мой локальный SMTP-сервервыдает "ok queue as" в конце письма

Мне нужно захватить это и распечатать в журналах

Как я могу это сделать

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 голосов
/ 15 октября 2018

Как уже упоминалось в комментариях, вы можете использовать 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
}

code, message и любые err теперь передаются вызывающей стороне, неиспользуйте log.Fatal во всем коде, обработайте ошибку на вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...