smtp 包实现了一个简单的邮件传输协议来发送邮件。它包含了一个代表客户端连接到 SMTP 服务器的 Client 类型:
- Dial 返回一个用于连接到 SMTP 服务器的客户端
- 设置 Mail(= 寄件人) 和 Rcpt (= 收件人)
- Data 返回一个可以写入数据的
writer,这里用buf.WriteTo(wc)写入
示例 15.26—smtp.go:
// smtp.gopackage mainimport ("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.gopackage mainimport ("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"
当然,也要把里面的寄件人、收件人等信息按照实际去修改一下。
