在goroutine中发送电子邮件

在goroutine中发送电子邮件,go,Go,我正在尝试用golang编程一个身份验证系统 用户成功注册后,将向用户发送电子邮件确认 我正在考虑在goroutine中执行sendmail函数。发送邮件功能的代码如下所示 func Send(email, link string) error { // Connect to the remote SMTP server. c, err := smtp.Dial("127.0.0.1:2525") if err != nil { return err

我正在尝试用golang编程一个身份验证系统

用户成功注册后,将向用户发送电子邮件确认

我正在考虑在goroutine中执行sendmail函数。发送邮件功能的代码如下所示

func Send(email, link string) error {

    // Connect to the remote SMTP server.
    c, err := smtp.Dial("127.0.0.1:2525")
    if err != nil {
        return err
    }
    // Set the sender and recipient.
    c.Mail("sender@example.org")
    c.Rcpt(email)
    // Send the email body.
    wc, err := c.Data()
    if err != nil {
        return err
    }
    defer wc.Close()
    buf := bytes.NewBufferString("Please confirm this email " + link)
    if _, err = buf.WriteTo(wc); err != nil {
        return err
    }
    return nil
}
如果在goroutine中发生错误,并且响应已经完成用户收到响应,那么我如何处理该错误?

我假设:

一个人注册一个帐户 您向他们发送一封带有激活链接的确认电子邮件 一旦他们点击链接,他们的账户现在可以做一些事情了 如果是这种情况:

您可能应该将此发送邮件操作的失败或成功记录到某种有状态存储SQL DB、mongo、leveldb等,然后,当用户登录或导航到某个页面时,您可以通知他们他们的帐户仍然需要确认,假设发送操作或URL单击确认链接从未发生,并提供重新发送电子邮件


另一种选择是对提交电子邮件地址做出响应等待电子邮件发送不要启动goroutine,但如果您有许多注册,则可能无法很好地扩展。。你仍然需要保持点击激活链接时的状态。因此,第一种选择更好。

这取决于您。您当然应该记录错误。就用户体验而言,可能会提供一个请求确认电子邮件重发页面,用户可以在该页面中输入其电子邮件地址,如果其帐户仍处于挂起状态,则系统可以尝试重新发送电子邮件。我敢说,上面提到的问题在这里是离题的。你想怎么处理?您可以向客户端发送推送通知,可以向数据库写入内容,还可以有一个单独的长期运行的后台进程等待处理电子邮件goroutines中的错误,其中错误通过一个通道进行通信。将错误暴露给另一个Go进程的唯一直接方法是通过通道。Send将在通道中引入一个额外的参数,而不是返回错误,它将通过通道发送错误。我如何向客户端发送推送通知,您有一些示例吗?