golang 实现 email 实例

代码:

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)
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值