Go Libs :email (SMTP与邮件发送 )
经常我们使用邮件来通知、报表或是信息发送等,本文将简介SMTP协议以及Go如何发送Email 。
SMTP POP3 IMAP
- Simple Mail Transfer Protocol(简单邮件传输协定) ,主要负责邮件的传输协议
- POP3(Post Office Protocol – Version 3)、IMAP(Internet Message Access Protocol), 负责接收邮件的过程协议
邮件发送流程拓扑图
1. 使用标准库 net/smtp 发送邮件
在Go语言中,可以使用标准库net/smtp
来发送邮件。下面是一个简单的例子:发送QQ邮件
(PS: qq邮箱需要预先开启 POP3/SMTP服务
IMAP/SMTP服务
两个服务,可参考文末【附1】)
package main
import (
"fmt"
"log"
"net/mail"
"net/smtp"
)
const (
smtpServer = "smtp.qq.com"
smtpPort = 25
senderEmail = "your@qq.com"
senderPassword = "pwd"
)
func main() {
recipientEmail := "your@163.com"
subject := "Verification code!"
body := "Your verification code is 9587"
err := SendEmail(senderEmail, senderPassword, recipientEmail, subject, body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Success")
}
func SendEmail(fromEmail, password, toEmail, subject, body string) error {
from := mail.Address{Name: "Jeff", Address: fromEmail}
to := mail.Address{Name: "", Address: toEmail}
message := fmt.Sprintf("From: %s\r\n", from.String())
message += fmt.Sprintf("To: %s\r\n", to.String())
message += fmt.Sprintf("Subject: %s\r\n\r\n%s", subject, body)
auth := smtp.PlainAuth("", fromEmail, password, smtpServer)
err := smtp.SendMail(fmt.Sprintf("%s:%d", smtpServer, smtpPort), auth, fromEmail, []string{toEmail}, []byte(message))
if err != nil {
return err
}
return nil
}
在邮箱里,将受到一封邮件,内容如下
上例中,
- 配置SMTP服务器信息:qq邮箱的SMTP服务器的地址、端口号,认证信息:用户名和密码
- 进行身份验证:通过调用smtp.PlainAuth进行身份验证。
- 设置发件人和收件人电子邮件地址
- 编写邮件内容,包括: 主题、正文和附件等
- 发送邮件:使用SendMail方法发送邮件
基础库的封装相对简单,接着我们介绍一些第三方库,并通过重写上面的例子,来演示如何使用
2. pkg: gomail.v2
Gomail 是一个简单而高效的电子邮件发送包。Gomail 只能使用 SMTP 服务器发送电子邮件。但 API 很灵活,很容易实现使用本地 Postfix、API 等发送电子邮件的其他方法。
重写SendEmail
后的例子如下:
package main
import (
"fmt"
"gopkg.in/gomail.v2"
)
func SendEmailByGoail(fromEmail, password, toEmail, subject, body string) error {
m := gomail.NewMessage()
m.SetHeader("From", m.FormatAddress(fromEmail, "jeff"))
m.SetHeader("To", toEmail)
m.SetHeader("Subject", subject)
m.SetBody("text/plain", body)
d := gomail.NewDialer(
smtpServer,
smtpPort,
fromEmail,
password,
)
if err := d.DialAndSend(m); err != nil {
return err
}
return nil
}
3. pkg: jordan-wright/email
该email
软件包设计得易于使用,但又足够灵活,不会受到限制。
feature:
- 发件人、收件人、密件抄送和抄送字段
- 电子邮件地址采用“ test@example.com ”和“First Last < test@example.com >”格式
- 文本和 HTML 消息正文
- 附件
- 已读收据
- 自定义标头
重写SendEmail
后的例子如下:
package main
import (
"fmt"
"github.com/jordan-wright/email"
"mime"
"net/smtp"
"strconv"
)
func SendEmailByJordanWright(senderEmail, senderPassword, recipientEmail, subject, body string) error {
e := email.NewEmail()
e.From = mime.QEncoding.Encode("UTF-8", "Jeff") + fmt.Sprintf("<%s>", senderEmail)
e.To = []string{recipientEmail}
e.Subject = subject
e.HTML = []byte(body)
auth := smtp.PlainAuth("", senderEmail, senderPassword, smtpServer)
err := e.Send(smtpServer+":"+strconv.Itoa(smtpPort), auth)
if err != nil {
return err
}
return nil
}
附1: 开启qq邮箱 POP3/SMTP服务
IMAP/SMTP服务
打开qq邮箱,通过以下操作路径打开
设置-- 账号 -- 打开
POP3/SMTP服务
IMAP/SMTP服务
两个服务开启
管理服务--生成授权码
<注意>安全性和限制
- 加密通信:使用TLS/SSL协议进行加密通信
- HTML转义和处理,以防止安全漏洞和跨站脚本攻击(XSS)
- 频率限制:邮件服务有频率限制,注意使用频率
小结
本文简介邮件发送流程,主要由SMTP、POP3/IMAP协议进行邮件的发送、接收。文中分别通过Go原生net/smtp和第三方库gomail.v2、jordan-wright/email 基于smtp协议发送邮件的例子,演示了Go是如何发送邮件的。
参考
转载自:https://juejin.cn/post/7351685099006296115