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

    • Dial 返回一个用于连接到 SMTP 服务器的客户端
    • 设置 Mail(= 寄件人) 和 Rcpt (= 收件人)
    • Data 返回一个可以写入数据的 writer,这里用 buf.WriteTo(wc) 写入

    示例 15.26—smtp.go:

    1. // smtp.go
    2. package main
    3. import (
    4. "bytes"
    5. "log"
    6. "net/smtp"
    7. )
    8. func main() {
    9. // 连接到远程 SMTP 服务器。
    10. client, err := smtp.Dial("mail.example.com:25")
    11. if err != nil {
    12. log.Fatal(err)
    13. }
    14. // 设置寄件人和收件人
    15. client.Mail("sender@example.org")
    16. client.Rcpt("recipient@example.net")
    17. // 发送邮件主体。
    18. wc, err := client.Data()
    19. if err != nil {
    20. log.Fatal(err)
    21. }
    22. defer wc.Close()
    23. buf := bytes.NewBufferString("This is the email body.")
    24. if _, err = buf.WriteTo(wc); err != nil {
    25. log.Fatal(err)
    26. }
    27. }

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

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

    示例 15.27—smtp_auth.go:

    1. // smtp_auth.go
    2. package main
    3. import (
    4. "log"
    5. "net/smtp"
    6. )
    7. func main() {
    8. // 设置认证信息。
    9. auth := smtp.PlainAuth(
    10. "",
    11. "user@example.com",
    12. "password",
    13. "mail.example.com",
    14. )
    15. // 连接到服务器, 认证, 设置发件人、收件人、发送的内容,
    16. // 然后发送邮件。
    17. err := smtp.SendMail(
    18. "mail.example.com:25",
    19. auth,
    20. "sender@example.org",
    21. []string{"recipient@example.net"},
    22. []byte("This is the email body."),
    23. )
    24. if err != nil {
    25. log.Fatal(err)
    26. }
    27. }

    译者注:
    按照这个示例代码,发送邮件是会被拒信的。看了下 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"
    当然,也要把里面的寄件人、收件人等信息按照实际去修改一下。