🆕新增了邮件工具
This commit is contained in:
parent
86c76add17
commit
8bcd3266d6
@ -7,5 +7,6 @@ type config struct {
|
|||||||
Database *database `yaml:"database"`
|
Database *database `yaml:"database"`
|
||||||
Redis *redis `yaml:"redis"`
|
Redis *redis `yaml:"redis"`
|
||||||
File *file `yaml:"file"`
|
File *file `yaml:"file"`
|
||||||
Wireguard wireguard `yaml:"wireguard"`
|
Mail *mail `yaml:"mail"`
|
||||||
|
Wireguard *wireguard `yaml:"wireguard"`
|
||||||
}
|
}
|
||||||
|
9
config/mail.go
Normal file
9
config/mail.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
type mail struct {
|
||||||
|
Host string `json:"host" yaml:"host"`
|
||||||
|
Port int `json:"port" yaml:"port"`
|
||||||
|
User string `json:"user" yaml:"user"`
|
||||||
|
Password string `json:"password" yaml:"password"`
|
||||||
|
SkipTls bool `json:"skipTls" yaml:"skipTls"`
|
||||||
|
}
|
2
go.mod
2
go.mod
@ -97,5 +97,7 @@ require (
|
|||||||
google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 // indirect
|
google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 // indirect
|
||||||
google.golang.org/grpc v1.50.1 // indirect
|
google.golang.org/grpc v1.50.1 // indirect
|
||||||
google.golang.org/protobuf v1.33.0 // indirect
|
google.golang.org/protobuf v1.33.0 // indirect
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
4
go.sum
4
go.sum
@ -1266,6 +1266,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
|
|||||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
|
||||||
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
@ -1277,6 +1279,8 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
|||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
|
gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
|
||||||
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||||
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
|
||||||
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
|
||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||||
|
85
utils/mail.go
Normal file
85
utils/mail.go
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
|
"gitee.ltd/lxh/logger/log"
|
||||||
|
"gopkg.in/gomail.v2"
|
||||||
|
"mime"
|
||||||
|
"path/filepath"
|
||||||
|
"wireguard-dashboard/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type mail struct {
|
||||||
|
md *gomail.Dialer
|
||||||
|
}
|
||||||
|
|
||||||
|
func Mail() mail {
|
||||||
|
mailDialer := gomail.NewDialer(config.Config.Mail.Host, config.Config.Mail.Port, config.Config.Mail.User, config.Config.Mail.Password)
|
||||||
|
mailDialer.TLSConfig = &tls.Config{
|
||||||
|
InsecureSkipVerify: config.Config.Mail.SkipTls,
|
||||||
|
}
|
||||||
|
return mail{mailDialer}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendMail
|
||||||
|
// @description: 发送普通邮件
|
||||||
|
// @receiver mail
|
||||||
|
// @param subject
|
||||||
|
// @param toAddress
|
||||||
|
// @param content
|
||||||
|
// @return err
|
||||||
|
func (m mail) SendMail(subject, toAddress, content string) (err error) {
|
||||||
|
msg := gomail.NewMessage()
|
||||||
|
msg.SetHeader("From", msg.FormatAddress(m.md.Username, "wireguard-dashboard"))
|
||||||
|
msg.SetHeader("To", toAddress)
|
||||||
|
msg.SetHeader("Subject", subject)
|
||||||
|
msg.SetBody("text/plain", content)
|
||||||
|
|
||||||
|
if err = m.md.DialAndSend(msg); err != nil {
|
||||||
|
log.Errorf("发送普通邮件失败: %v", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendMailWithAttach
|
||||||
|
// @description: 发送并携带附件
|
||||||
|
// @receiver m
|
||||||
|
// @param subject
|
||||||
|
// @param toAddress
|
||||||
|
// @param content
|
||||||
|
// @param attachPath
|
||||||
|
// @return err
|
||||||
|
func (m mail) SendMailWithAttach(subject, toAddress, content, attachPath string) (err error) {
|
||||||
|
msg := gomail.NewMessage()
|
||||||
|
msg.SetHeader("From", msg.FormatAddress(m.md.Username, "wireguard-dashboard"))
|
||||||
|
msg.SetHeader("To", toAddress)
|
||||||
|
msg.SetHeader("Subject", subject)
|
||||||
|
msg.SetBody("text/plain", content)
|
||||||
|
|
||||||
|
rename := m.getFileName(attachPath)
|
||||||
|
|
||||||
|
msg.Attach(attachPath, gomail.Rename(rename), gomail.SetHeader(map[string][]string{
|
||||||
|
"Content-Disposition": {
|
||||||
|
fmt.Sprintf(`attachment; filename="%s"`, mime.BEncoding.Encode("UTF-8", rename)),
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
|
||||||
|
if err = m.md.DialAndSend(msg); err != nil {
|
||||||
|
log.Errorf("发送普通邮件失败: %v", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// getFileName
|
||||||
|
// @description: 获取文件名
|
||||||
|
// @receiver m
|
||||||
|
// @param filePath
|
||||||
|
// @return string
|
||||||
|
func (m mail) getFileName(filePath string) string {
|
||||||
|
return filepath.Base(filePath)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user