首页  >  文章  >  后端开发  >  我可以在不使用 SMTP 服务器的情况下在 Go 中发送电子邮件吗?

我可以在不使用 SMTP 服务器的情况下在 Go 中发送电子邮件吗?

DDD
DDD原创
2024-10-25 20:27:021100浏览

Can I Send Emails in Go Without Using an SMTP Server?

在 Go 中没有 SMTP 服务器发送电子邮件

问题:

您想要发送由于使用限制,无需依赖外部 SMTP 服务器即可批量发送电子邮件。你可以使用 Go 的标准库在没有 SMTP 服务器的情况下发送电子邮件吗?

答案:

要在没有 SMTP 服务器的情况下发送电子邮件,你必须将任务委托给另一个有能力的程序发送电子邮件。在 POSIX 系统中,/usr/sbin/sendmail 程序通常可用于此目的。您可以使用 -t 选项调用它,以从邮件的 To 标头中检索收件人地址。

将标准库与 Sendmail 结合使用

您可以使用 os/exec 、net/mail 和 net/textproto 包直接调用 Sendmail,但 gomail 包提供了更简单的解决方案。它的 Message 类型包括一个 WriteTo() 方法,可以写入正在运行的 Sendmail 实例。下面是一个示例:

<code class="go">import (
    "os/exec"

    "github.com/go-gomail/gomail"
)

const sendmailPath = "/usr/sbin/sendmail"

func sendEmail(m *gomail.Message) error {
    cmd := exec.Command(sendmailPath, "-t")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    stdin, err := cmd.StdinPipe()
    if err != nil {
        return err
    }

    if err := cmd.Start(); err != nil {
        return err
    }

    if _, err := m.WriteTo(stdin); err != nil {
        return err
    }

    if err := stdin.Close(); err != nil {
        return err
    }

    if err := cmd.Wait(); err != nil {
        return err
    }

    return nil
}</code>

使用 MTA 的优点:

虽然使用 MTA 可能看起来像是一个额外的步骤,但它提供了邮件排队的优势。如果 MTA 无法立即传递邮件(例如在网络中断期间),它会将邮件存储在队列中并重复尝试传递邮件,直到成功或发生超时。

以上是我可以在不使用 SMTP 服务器的情况下在 Go 中发送电子邮件吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn