15.12 用 smtp 发送邮件

smtp 包实现了用于发送邮件的“简单邮件传输协议”(Simple Mail Transfer Protocol)。它有一个 Client 类型,代表一个连接到 SMTP 服务器的客户端:

  • Dial() 方法返回一个已连接到 SMTP 服务器的客户端 Client
  • 设置 Mail(from,即发件人)和 Rcpt(to,即收件人)
  • Data() 方法返回一个用于写入数据的 Writer,这里利用 buf.WriteTo(wc) 写入

示例 15.26 smtp.go

  1. package main
  2. import (
  3. "bytes"
  4. "log"
  5. "net/smtp"
  6. )
  7. func main() {
  8. // Connect to the remote SMTP server.
  9. client, err := smtp.Dial("mail.example.com:25")
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. // Set the sender and recipient.
  14. client.Mail("sender@example.org")
  15. client.Rcpt("recipient@example.net")
  16. // Send the email body.
  17. wc, err := client.Data()
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. defer wc.Close()
  22. buf := bytes.NewBufferString("This is the email body.")
  23. if _, err = buf.WriteTo(wc); err != nil {
  24. log.Fatal(err)
  25. }
  26. }

如果需要认证,或有多个收件人时,也可以用 SendMail() 函数发送。它连接到地址为 addr 的服务器;如果可以,切换到 TLS(“传输层安全”加密和认证协议),并用 PLAIN 机制认证;然后以 from 作为发件人,to 作为收件人列表,msg 作为邮件内容,发出一封邮件:

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

示例 15.27 smtp_auth.go

  1. package main
  2. import (
  3. "log"
  4. "net/smtp"
  5. )
  6. func main() {
  7. // Set up authentication information.
  8. auth := smtp.PlainAuth(
  9. "",
  10. "user@example.com",
  11. "password",
  12. "mail.example.com",
  13. )
  14. // Connect to the server, authenticate, set the sender and recipient,
  15. // and send the email all in one step.
  16. err := smtp.SendMail(
  17. "mail.example.com:25",
  18. auth,
  19. "sender@example.org",
  20. []string{"recipient@example.net"},
  21. []byte("This is the email body."),
  22. )
  23. if err != nil {
  24. log.Fatal(err)
  25. }
  26. }

链接