go - SMTP 连接阅读欢迎信息

标签 go smtp

我尝试连接到 smtp 服务器并阅读欢迎消息。这是我的代码:

package main

import (
    "fmt"
    "net"
    "time"
    "net/smtp"
    "bufio"
)

func main() {
    // attempt a connection
    conn, _ := net.DialTimeout("tcp", "88.198.24.108:25", 15 * time.Second)

    buf := bufio.NewReader(conn)
    bytes, _ := buf.ReadBytes('\n')
    fmt.Printf("%s", bytes)


    client, err := smtp.NewClient(conn, "88.198.24.108")
    if err != nil {
        fmt.Println("1>>", err)
        return
    }

    client.Quit()
    conn.Close()
}

问题是在读取欢迎消息后停止运行并等待超时,我想读取/打印欢迎消息并继续。

220 example.me ESMTP Haraka/2.8.18 ready
1>> 421 timeout

最佳答案

检查标准库源表明 smtp.NewClient()从远程主机读取 SMTP 横幅并将其丢弃。

func NewClient(conn net.Conn, host string) (*Client, error) {
    text := textproto.NewConn(conn)
    _, _, err := text.ReadResponse(220)
    if err != nil {
        text.Close()
        return nil, err
    }
    c := &Client{Text: text, conn: conn, serverName: host, localName: "localhost"}
    _, c.tls = conn.(*tls.Conn)
    return c, nil
}

您想阅读此横幅并根据其内容决定是否发送邮件。

因为您自己已经阅读了横幅,并且可能会就此做出决定,而不是调用 smtp.NewClient()然后你应该实现 NewClient() 的其余部分在您自己的代码中,可能是这样的:

    client := &smtp.Client{Text: text, conn: conn, serverName: host, localName: "localhost"}
    _, client.tls = conn.(*tls.Conn)

关于go - SMTP 连接阅读欢迎信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962763/

相关文章:

java - 根据开发/测试/生产模式更改 Spring 电子邮件设置

go - 比较 Go 中的 2 个错误进行单元测试

go - 使用包作为全局变量的存储

适用于 Windows 的 Go 编译器

email - 在 elisp 中发送电子邮件的最简单、最便携的方式是什么?

php - 未通过 gmail 收到 laravel 5 邮件

heroku - 如何在 Heroku 上使用我的 Go 网络应用程序构建实用程序?

go - 如何使用go get获取包的指定版本(标签)?

PHP 无法使用 TLS 连接到 SMTP

.net - 有没有一种方法可以判断 SMTP 服务器是否期望客户端使用 "implicit"SSL 与 "explicit"SSL 进行连接?