go - 在 goroutine 中发送电子邮件

标签 go

我正在尝试使用 golang 编写身份验证系统。

用户注册成功后,会向用户发送确认邮件。

我想在 goroutine 中执行发送邮件功能。发送邮件功能的代码如下所示

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 将发生错误并且响应已经完成(用户收到响应),那么我该如何处理错误?

最佳答案

我假设:

  1. 一个人注册一个帐户
  2. 您向他们发送一封带有激活链接的确认电子邮件
  3. 一旦他们点击链接,他们的帐户现在就可以“做事”

如果是这样的话:

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

另一种选择是对提交电子邮件地址做出响应,等待电子邮件发送(不要启动 goroutine),但如果你有很多注册,这可能无法很好地扩展......而且你无论如何,仍然需要维护点击激活链接的人的状态。所以第一个选项更好。

关于go - 在 goroutine 中发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839709/

相关文章:

go - 在 Windows 上安装 gokogiri 时找不到错误 libxml2

Go:基本的 for 循环和 strconv

mysql - 如何检索最后添加的项目的实例

unicode - 如何检索 []rune 的第一个 “complete” 字符?

go - golang中的插入排序

go - net/http Serve 方法何时返回错误?

go - 如何等到 POST 请求在 GO 中完成?

emacs - Emacs 有类似 go-eldoc-mode 的东西吗?

go - 是否可以在不添加接口(interface)的情况下 stub /模拟函数调用?

go - 生成唯一ID并附加到Slice