Golang 发送邮件失败,本地执行正常,但到服务器上之后邮件一直发不出去?

一段很简单的代码,在本地执行正常,但到服务器上之后邮件一直发不出去。

package main

import (
    "fmt"
    "github.com/jordan-wright/email"
    "net/smtp"
)

func main() {
    em := email.NewEmail()
    em.From = "xxxxxxxxx@qq.com"
    em.To = []string{"xxxxxxx@foxmail.com"}
    em.Subject = "test title"
    em.HTML = []byte("hello world")
    err := em.Send(
        "smtp.qq.com:25",
        smtp.PlainAuth(
            "",
            "xxxxxxxx@qq.com",
            "xxxxxxxxxxxxx",
            "smtp.qq.com",
        ))
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }
    fmt.Println("ok")
}

请问一下大佬们这个是网络问题吗?或者别的什么问题

阅读 3k
3 个回答
新手上路,请多包涵
  1. 首先需要明确发不出去是否有报错?毕竟你有抓取错误,查看一下终端是否有报错信息,是否有超时或者其他异常。
  2. 其次,本地环境和服务器环境是否是一致的?操作系统是否一样?如果不一样,请检查交叉编译命令是否正确,如果直接运行的代码,则需要下载mod。
  3. 如果没有报错则需要检测服务器配置:

    1. 服务器是否有网络?执行ping 114.114.114.114,是否是通畅?如果不通畅则需要检查服务器的网络配置,是dhcp动态的还是static静态网络,根据操作系统不同进行具体配置,如果不清楚如何配置可以继续讨论。
    2. 如果上一步没问题,则检查服务器的DNS是否正常,执行ping www.baidu.com,如果不通,例如报unknown host name类似的错,就是服务器DNS配有配置对,如果是centos,需要配置/etc/resolv.conf,添加对应的dns记录。其他的服务器如果不知如何配置可以继续讨论。
  4. 如果以上都没有问题,则检查一下邮箱是否有做访问限制,例如IP白名单以及其他策略限制

具体信息要参考报的错。

不过发邮件smtp包有自带的函数你干嘛不用呢。

也就拼一个消息体的代码量。

msg := []byte(fmt.Sprintf(
    "To:%s\r\n"+
        "From:%s<%s>\r\n"+
        "Subject:%s\r\n"+
        "%s\r\n"+
        "\r\n"+
        "%v",
    to,
    name, 
    address,
    subject,
    "Content-Type: text/html; charset=UTF-8",
    body,
))

包里甚至连示例都给你写好了。

建议直接使用smtp.SendMail


更新

巧了不是,今天部署应用的时候也遇到了相同的问题,报TCP连接超时,其实原因很简单,就是国内供应商的云服务器的25端口默认都是封禁状态,且无法打开,所以访问25端口肯定是超时的。

你可以试一下telnet,如果连不上你的邮件服务器,那么百分百是这个原因。

试试587端口,SSL的话就试一下465端口,不过具体还要看你的邮件服务器的文档,本质还是端口被封禁导致的连接超时。

把smtp通讯日志打开, 看看有什么错.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题