1. 发邮件

    电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过go代码来创建电子邮件,并连接邮件服务器发送邮件。

    电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

    • 发件人,收件人,密件抄送和抄送字段
    • 文字和HTML邮件正文
    • 附件
    • 阅读收据
    • 自定义标题

    注意:此库的版本需要Go v1.5或更高版本。 如果需要与以前的Go版本兼容,则可以在gopkg.in/jordan-wright/email.v1中使用以前的软件包。

    我们需要额外一些工作。我们知道邮箱使用SMTP/POP3/IMAP等协议从邮件服务器上拉取邮件。邮件并不是直接发送到邮箱的,而是邮箱请求拉取的。所以,我们需要配置SMTP/POP3/IMAP服务器。从头搭建固然可行,而且也有现成的开源库,但是比较麻烦。现在一般的邮箱服务商都开放了SMTP/POP3/IMAP服务器。我这里拿 QQ 邮箱来举例。

    • 首先我们登录QQ邮箱,设置->账户 找到图片的位置开启并且按照要求生产授权码

    1. package main
    2. import (
    3. "log"
    4. "net/smtp"
    5. "github.com/jordan-wright/email"
    6. )
    7. func main() {
    8. e := email.NewEmail()
    9. //设置发送方的邮箱
    10. e.From = "dj <XXX@qq.com>"
    11. // 设置接收方的邮箱
    12. e.To = []string{"XXX@qq.com"}
    13. //设置主题
    14. e.Subject = "这是主题"
    15. //设置文件发送的内容
    16. e.Text = []byte("www.topgoer.com是个不错的go语言中文文档")
    17. //设置服务器相关的配置
    18. if err != nil {
    19. log.Fatal(err)
    20. }
    21. }

    运行程序就会给你设置的邮箱发送一个邮件,有的邮箱会把邮件当成垃圾邮件发到垃圾箱里面,如果找不到邮件可以去垃圾箱看下。

    2.实现抄送功能

    该插件有两种抄送模式即 CC(Carbon Copy)和 BCC (Blind Carbon Copy)

    抄送功能只需要添加两个参数就好了

    全部代码:

    1. package main
    2. "log"
    3. "net/smtp"
    4. "github.com/jordan-wright/email"
    5. )
    6. func main() {
    7. e := email.NewEmail()
    8. //设置发送方的邮箱
    9. e.From = "dj <XXX@qq.com>"
    10. // 设置接收方的邮箱
    11. e.To = []string{"XXX@qq.com"}
    12. //设置抄送如果抄送多人逗号隔开
    13. e.Cc = []string{"XXX@qq.com",XXX@qq.com}
    14. //设置秘密抄送
    15. e.Bcc = []string{"XXX@qq.com"}
    16. //设置主题
    17. e.Subject = "这是主题"
    18. //设置文件发送的内容
    19. e.Text = []byte("www.topgoer.com是个不错的go语言中文文档")
    20. //设置服务器相关的配置
    21. err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
    22. if err != nil {
    23. }
    24. }

    代码实现:

    4.实现邮件附件的发送

    直接调用AttachFile即可

    1. import (
    2. "log"
    3. "net/smtp"
    4. "github.com/jordan-wright/email"
    5. )
    6. func main() {
    7. e := email.NewEmail()
    8. //设置发送方的邮箱
    9. e.From = "dj <XXX@qq.com>"
    10. // 设置接收方的邮箱
    11. e.To = []string{"XXX@qq.com"}
    12. //设置主题
    13. e.Subject = "这是主题"
    14. //设置文件发送的内容
    15. e.HTML = []byte(`
    16. <h1><a href="http://www.topgoer.com/">go语言中文网站</a></h1>
    17. `)
    18. //这块是设置附件
    19. e.AttachFile("./test.txt")
    20. //设置服务器相关的配置
    21. err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "你的邮箱账号", "这块是你的授权码", "smtp.qq.com"))
    22. if err != nil {
    23. log.Fatal(err)
    24. }

    5.连接池

    实际上每次调用Send时都会和 SMTP 服务器建立一次连接,如果发送邮件很多很频繁的话可能会有性能问题。email提供了连接池,可以复用网络连接:

    参考: