15.12. SMTP 发送邮件

未匹配的标注

smtp 包实现了一个简单的邮件传输协议来发送邮件。它包含了一个代表客户端连接到 SMTP 服务器的 Client 类型:

  • Dial 返回一个用于连接到 SMTP 服务器的客户端

  • 设置 Mail(= 寄件人) 和 Rcpt (= 收件人)

  • Data 返回一个可以写入数据的 writer,这里用 buf.WriteTo(wc) 写入

示例 15.26—smtp.go:

// smtp.go
package main

import (
        "bytes"
        "log"
        "net/smtp"
)

func main() {
        // 连接到远程 SMTP 服务器。
        client, err := smtp.Dial("mail.example.com:25")
        if err != nil {
                log.Fatal(err)
        }
        // 设置寄件人和收件人
        client.Mail("sender@example.org")
        client.Rcpt("recipient@example.net")
        // 发送邮件主体。
        wc, err := client.Data()
        if err != nil {
                log.Fatal(err)
        }
        defer wc.Close()
        buf := bytes.NewBufferString("This is the email body.")
        if _, err = buf.WriteTo(wc); err != nil {
                log.Fatal(err)
        }
}

如果需要权限认证并且有多个收件人,可以使用 SendMail 函数。它可以使用下面示例的格式来发送一封邮件, addr 是需要连接服务器,如果可以切换到 TLS (安全传输层协议) ,通过机制 a 进行认证, from 是寄件人地址 、to 是发件人地址 、 msg 是发送的消息:

func SendMail(addr string, a Auth, from string, to []string, msg []byte) error

示例 15.27—smtp_auth.go:

// smtp_auth.go
package main

import (
        "log"
        "net/smtp"
)

func main() {
        // 设置认证信息。
        auth := smtp.PlainAuth(
                "",
                "user@example.com",
                "password",
                "mail.example.com",
        )
        // 连接到服务器, 认证, 设置发件人、收件人、发送的内容,
        // 然后发送邮件。
        err := smtp.SendMail(
                "mail.example.com:25",
                auth,
                "sender@example.org",
                []string{"recipient@example.net"},
                []byte("This is the email body."),
        )
        if err != nil {
                log.Fatal(err)
        }
}

译者注:
按照这个示例代码,发送邮件是会被拒信的。看了下 SendMail 的源码,它要求 msg 参数要符合 RFC 822 电子邮件的标准格式。
所以示例中的 "This is the email body." 要修改一下才能发送成功。修改后的示例如下:
"To: recipient@example.net\r\nFrom: sender@example.org\r\nSubject: 邮件主题\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\nHello World"
当然,也要把里面的寄件人、收件人等信息按照实际去修改一下。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/the-way-to-go/1...

译文地址:https://learnku.com/docs/the-way-to-go/1...

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~