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"
当然,也要把里面的寄件人、收件人等信息按照实际去修改一下。