在go+ gin框架中使用gomail.v2实现邮件通知功能
Go  /  管理员 发布于 7个月前   377
在go中实现邮件发送功能,也比较方便有专门扩展包:gomail.v2
Gomail是一个简单高效的发送电子邮件go语言的模块包,其使用SMTP服务器发送电子邮件含附件.
https://pkg.go.dev/gopkg.in/gomail.v2
废话不多说,直接代码复制粘贴中
配置文件 config.yaml
#email
email:
host: 'smtp.mxhichina.com'
port: 465
user-name: "zongscan"
from-email: "[email protected]"
form-passwd: "xx"
gmail-email: "[email protected]"
gmail-passwd: "xx"
gmail-host: "smtp.gmail.com"
gmail-port: 465
imap-host: "imap.mxhichina.com"
imap-port: "993"
gmail-imap-host: "imap.gmail.com"
gmail-imap-port: "993"
这里我把邮件方法写在utils中
/utils/email.go
package utils
import (
"errors"
"fmt"
"regexp"
"zongscan-go/global"
"gopkg.in/gomail.v2"
)
type EmailInfo struct {
ServerHost string
ServerPort int
FromEmail string
Username string
FormPasswd string
CC []string
GmailEmail string
GmailPasswd string
GmailHost string
GmailPort int
subject string
body string
recipient []string
}
type emailType = uint8
var (
defaulType emailType = 1
gmailType emailType = 2
)
// 获取发送的邮件发送方
func getEmailType(email string) (t emailType, err error) {
reg := regexp.MustCompile(`@[a-z]|[0-9]+`)
regList := reg.FindAllString(email, -1)
if len(regList) == 0 {
err = errors.New("email reg failed")
return
}
t = gmailType
return
}
func NewEmailInfo() *EmailInfo {
return &EmailInfo{
ServerHost: global.GVA_CONFIG.Email.Host,
ServerPort: global.GVA_CONFIG.Email.Port,
FromEmail: global.GVA_CONFIG.Email.FromEmail,
Username: global.GVA_CONFIG.Email.Username,
FormPasswd: global.GVA_CONFIG.Email.FormPasswd,
GmailEmail: global.GVA_CONFIG.Email.GmailEmail,
GmailPasswd: global.GVA_CONFIG.Email.GmailPasswd,
GmailHost: global.GVA_CONFIG.Email.GmailHost,
GmailPort: global.GVA_CONFIG.Email.GmailPort,
CC: nil,
}
}
func SendEmail(subject, body string, recipient ...string) (err error) {
if len(recipient) == 0 {
err = errors.New("must have email")
return
}
info := NewEmailInfo()
t, err := getEmailType(recipient[0])
if err != nil {
return
}
if len(recipient) == 0 {
err = errors.New("recipient is null")
return
}
info.body = body
info.subject = subject
info.recipient = recipient
err = info.ToSend(t)
return
}
// 发送
func (e *EmailInfo) ToSend(t emailType) (err error) {
var (
fromEmail, username, fromPasswd, serverHost string
serverPort int
)
// 统一由gmail发送邮箱
serverHost = e.GmailHost
serverPort = e.GmailPort
username = e.Username
fromEmail = e.GmailEmail
fromPasswd = e.GmailPasswd
m := gomail.NewMessage()
// 设置收件人
m.SetHeader("To", e.recipient...)
// 设置抄送列表
if len(e.CC) != 0 {
m.SetHeader("Cc", e.CC...)
}
// 第三个参数为发件人别名
m.SetAddressHeader("From", fromEmail, username)
// 主题
m.SetHeader("Subject", e.subject)
m.SetBody("text/html", e.body)
d := gomail.NewDialer(serverHost, serverPort, fromEmail, fromPasswd)
err = d.DialAndSend(m)
return
}
type OrderInform struct {
OrderNo uint
Total uint
Status string
Email string
Currency string
}
var OrderInformChan = make(chan OrderInform, 100)
func (o OrderInform) OrderTemplete() string {
return fmt.Sprintf("您好,你的订单编号:%d,金额:%d%s,状态变更为:%s,感谢支持,祝您生活愉快!【zongscan.com】", o.OrderNo, o.Total, o.Currency, o.Status)
}
func ChanToOrderInfo(inform OrderInform) {
OrderInformChan <- inform
}
func (o OrderInform) SendOrderMsg() (err error) {
v := o.OrderTemplete()
err = SendEmail("order", v, o.Email)
return
}
func OrderNotification() {
go func() {
for {
v, ok := <-OrderInformChan
if !ok {
fmt.Println("email channel already close")
break
}
v.SendOrderMsg()
}
}()
}
调用使用
// 测试发邮件
func Getcessendemail(c *gin.Context) {
// 发送邮箱
inform := utils.OrderInform{OrderNo: 11111, Total: 22, Status: "3" , Email: "[email protected]", Currency: "1234"}
utils.ChanToOrderInfo(inform)
resp.Ok(c)
}
有兴趣可自行测试!
对了发个测试效果图
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号