在go+ gin框架中使用gomail.v2實現(xiàn)郵件通知功能
Go  /  管理員 發(fā)布于 10個月前   503
在go中實現(xiàn)郵件發(fā)送功能,也比較方便有專門擴展包:gomail.v2
Gomail是一個簡單高效的發(fā)送電子郵件go語言的模塊包,其使用SMTP服務(wù)器發(fā)送電子郵件含附件.
https://pkg.go.dev/gopkg.in/gomail.v2
廢話不多說,直接代碼復(fù)制粘貼中
配置文件 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
)
// 獲取發(fā)送的郵件發(fā)送方
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
}
// 發(fā)送
func (e *EmailInfo) ToSend(t emailType) (err error) {
var (
fromEmail, username, fromPasswd, serverHost string
serverPort int
)
// 統(tǒng)一由gmail發(fā)送郵箱
serverHost = e.GmailHost
serverPort = e.GmailPort
username = e.Username
fromEmail = e.GmailEmail
fromPasswd = e.GmailPasswd
m := gomail.NewMessage()
// 設(shè)置收件人
m.SetHeader("To", e.recipient...)
// 設(shè)置抄送列表
if len(e.CC) != 0 {
m.SetHeader("Cc", e.CC...)
}
// 第三個參數(shù)為發(fā)件人別名
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,狀態(tài)變更為:%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()
}
}()
}
調(diào)用使用
// 測試發(fā)郵件
func Getcessendemail(c *gin.Context) {
// 發(fā)送郵箱
inform := utils.OrderInform{OrderNo: 11111, Total: 22, Status: "3" , Email: "[email protected]", Currency: "1234"}
utils.ChanToOrderInfo(inform)
resp.Ok(c)
}
有興趣可自行測試!
對了發(fā)個測試效果圖
123 在
Clash for Windows作者刪庫跑路了,github已404中評論 按理說只要你在國內(nèi),所有的流量進出都在監(jiān)控范圍內(nèi),不管你怎么隱藏也沒用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最簡單的方法中評論 好久好久都沒看友情鏈接申請了,今天剛看,已經(jīng)添加。..博主 在
佛跳墻vpn軟件不會用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評論 @1111老鐵這個不行了,可以看看近期評論的其他文章..1111 在
佛跳墻vpn軟件不會用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評論 網(wǎng)站不能打開,博主百忙中能否發(fā)個APP下載鏈接,佛跳墻或極光..路人 在
php中使用hyperf框架調(diào)用訊飛星火大模型實現(xiàn)國內(nèi)版chatgpt功能示例中評論 教程很詳細(xì),如果加個前端chatgpt對話頁面就完美了..
Copyright·? 2019 侯體宗版權(quán)所有·
粵ICP備20027696號