代码:
package email
import (
"log"
"strconv"
"sync"
"time"
"gopkg.in/gomail.v2"
)
type EMAIL struct {
mailConn map[string]string
closed bool
lock sync.Mutex
sender gomail.SendCloser
}
var g_handle *EMAIL
func Instance() *EMAIL {
if g_handle == nil {
g_handle = new(EMAIL)
g_handle.mailConn = make(map[string]string)
g_handle.closed = true
go g_handle.workThread()
}
return g_handle
}
func (c *EMAIL) workThread() {
ticker := time.NewTicker(300 * time.Second) // 每隔5m进行一次
for {
<-ticker.C
c.lock.Lock()
if !c.closed {
c.sender.Close()
c.closed = true
}
c.lock.Unlock()
}
}
func (c *EMAIL) getSender() gomail.SendCloser {
if c.closed == true {
c.closed = false
c.initSender()
}
return c.sender
}
func (c *EMAIL) initSender() error {
//定义邮箱服务器连接信息,如果是阿里邮箱 pass填密码,qq邮箱填授权码
c.mailConn = map[string]string{
// "user": "xx@qq.com",
"user": "xx@qq.com",
"pass": "xxx",
"host": "smtp.qq.com",
"port": "465",
}
port, _ := strconv.Atoi(c.mailConn["port"]) //转换端口类型为int
smtp := gomail.NewDialer(c.mailConn["host"], port, c.mailConn["user"], c.mailConn["pass"])
sendCloser, err := smtp.Dial()
if err == nil {
// sendCloser.Close()
c.sender = sendCloser
} else {
log.Println(err)
}
return err
}
func (c *EMAIL) SendMail(to, asial, subject, body string) error {
c.lock.Lock()
defer c.lock.Unlock()
//定义收件人
mailTo := []string{
to,
}
m := gomail.NewMessage()
//m.SetHeader("From", asial+"<"+mailConn["user"]+">") // 添加别名 中文乱码
m.SetAddressHeader("From", c.mailConn["user"], asial) //添加别名
m.SetHeader("To", mailTo...) //发送给多个用户
m.SetHeader("Subject", subject) //设置邮件主题
m.SetBody("text/html", body) //设置邮件正文
return c.getSender().Send(c.mailConn["user"], mailTo, m)
}