使用EOF 10分钟后smtp.SendMail失败

时间:2012-07-26 03:40:21

标签: smtp go

我正在尝试通过标准库SMTP软件包发送邮件,它不会在10分钟内完成任何操作,然后因无法理解的文件结束错误而失败。

// excerpt from the calling function
// --- snip ---
if e := mailNotify(board, validPosts, ipMinusPort, delTime); e != nil {
    errorPage(w, tmpl, "Contact Administrator",
        "Email notification failed, please contact archive admin.")
    log.Println("ERROR: Failed to send notification email: " + e.Error())
}
// --- snip ---

func mailNotify(board *config.Board, validPosts []int64, 
                        ip string, delTime time.Time) error {

    addresses := strings.Split(board.NotifyAddr, ",")
    if len(addresses) < 1 {
        return nil
    }

    msg := new(bytes.Buffer)
    type values struct {
        IP      string
        Posts   []int64
        DelTime time.Time
    }
    t.ExecuteTemplate(msg, "post_reported", &values{ip, validPosts, delTime})
    auth:= smtp.PlainAuth("", board.NotifyAddr, board.NotifyPass,
        strings.Split(board.SMTPServer, ":")[0])
    return smtp.SendMail(board.SMTPServer, auth,
        board.FromEmail, addresses, msg.Bytes())
}

记录的确切消息是:

  

2012/07/25 22:57:58错误:无法发送通知电子邮件:EOF

log.Printf调试了此函数,并验证此时发送的值是否有效。电子邮件地址是gmail.com上的真实地址,密码正确,board.SMTPServersmtp.googlemail.com:465。我已经尝试将msg.Bytes()的结果存储在一个单独的变量中并获取长度以确保它生成一个要发送的字节数组,并且长度确实非零。我猜EOF正在从标准库中更深层次的文件冒出来,而不是SendMail函数本身,但我不知道它在哪里窒息,我不知道我做了什么来打扰它。

1 个答案:

答案 0 :(得分:17)

Gmail的端口465用于通过TLS进行连接,但SendMail需要普通的旧TCP。尝试连接到端口587。 SendMail会在可用时自动升级到TLS(在这种情况下就是这样)。