用go发送一封邮件|Go主题月

1,817 阅读2分钟

SMTP协议介绍

SMTP协议全称是Simple Mail Tansfer Protocol,中文翻译就是简单的邮件传输协议。go标准库也实现了这个协议,在gonet/smtp包下可以看到它的具体实现,可以看到go是通过一系列的SMTP指令来实现的。SMTP协议发送邮件的指令流程大致如下:

快速发送一封邮件

我们可以直接使用net/smtp下封装好的函数SendMail来快速发送一封邮件,这里使用QQ邮箱来示例:

package main

import (
	"log"
	"net/smtp"
)

func main() {
    // 设置发送方账户信息信息,这边密码要填入邮箱授权码,获取授权码步骤可以网上查一查
	auth := smtp.PlainAuth("", "211019847@qq.com", "填入你的邮箱授权码", "smtp.qq.com")
    // 设置接收方信息
	to := []string{"573419235@qq.com"}
    // 编辑邮件内容
	msg := []byte("To: 573419235@qq.com\r\n" +
		"Subject: discount Gophers!\r\n" +
		"\r\n" +
		"This is the email body.\r\n")
    // 调用函数发送邮件
	err := smtp.SendMail("smtp.qq.com:25", auth, "211019847@qq.com", to, msg)
	if err != nil {
		log.Fatal(err)
	}
}

运行上面的方法后,就会收到一封主题为discount Gophers!,内容为**This is the email body.**的邮件了。

上面的msg需遵守RFC 822规范。

使用自定义步骤发送一封邮件

上面是直接调用了封装好的函数来发送邮件,同时net/smtp包也开放了SMTP的指令方法,我们可以根据SMTP的指令流程来自己构建一个发送邮件的方法,

具体代码如下:

package main

import (
    "crypto/tls"
	"log"
	"net/smtp"
)

func main() {
    // 设置发送方账号信息
	auth := smtp.PlainAuth("", "211019847@qq.com", "填入你的邮箱授权码", "smtp.qq.com")
	// 与QQ的`SMTP`服务器建立`TCP`连接
	client,err:=smtp.Dial("smtp.qq.com:25")
	if err!=nil {
		log.Fatal(err)
	}
	// 发送HELO/EHLO指令
	err=client.Hello("灰灰")
	if err!=nil {
		log.Fatal(err)
	}
	// 客户端开启`TLS`加密
	config := &tls.Config{ServerName: "smtp.qq.com"}
	client.StartTLS(config)

	// 发送AUTH指令验证发送方账号信息
	err=client.Auth(auth)
	if err!=nil {
		log.Fatal(err)
	}
	// 发送MAIL指令
	err=client.Mail("211019847@qq.com")
	if err!=nil {
		log.Fatal(err)
	}
	// 发送RCPT指令
	err=client.Rcpt("573419235@qq.com")
	if err!=nil {
		log.Fatal(err)
	}

	// 发送DATA指令
	w,err:=client.Data()
	if err!=nil {
		log.Fatal(err)
	}
	// 写入消息
	msg:=[]byte("FROM: 211019847@qq.com\n" +
		"To: 573419235@qq.com\r\n" +
		"Subject:  Go MAIL\r\n" +
		"\r\n" +
		"GO MAIL TEST!.\r\n")
	w.Write(msg)
	w.Close()

	// 关闭客户端
	client.Quit()
}

运行上面的方法后,就会收到一封主题为Go MAIL,内容为**GO MAIL TEST!.**的邮件了。

总结

标准库的net/smtp包只是提供了最基础的功能,但是我们可以更具这些提供的基础功能来封装自己发送邮件的方法,比如实现线程邮件线程池等等功能