golang gomail+fasttemplate+mailhog 发送邮件
今天有写过一个基于go-simple-mail 发送email 的demo,主要是复用连接,但是发现有问题,后边尝试了下
gomail,发现很不错没有问题,通过分析代码,还是go-simple-mail 实现上的问题
gomail参考demo
大部分不变,主要是修改关于email 发送的实现
参考代码
emailv2.go
package notify
import (
"demoapp/config"
"io/ioutil"
"log"
"github.com/valyala/fasttemplate"
"gopkg.in/gomail.v2"
)
// EmailNotidy2 is a email notify
type EmailNotidy2 struct {
config config.Config
dialer *gomail.Dialer
templateCache map[string]string
}
// NewEailNotidy2 NewEailNotidy2 instance
func NewEailNotidy2() *EmailNotidy2 {
config := config.New()
d := gomail.NewDialer(config.Email.ServerHost, config.Email.ServerPort, config.Email.FromEmail, config.Email.FromPasswd)
bytes, err := ioutil.ReadFile(config.Template.EmailTemplate)
if err != nil {
log.Fatalf("init mail instance error:%s", err.Error())
}
return &EmailNotidy2{
config: config,
dialer: d,
templateCache: map[string]string{
config.Template.EmailTemplate: string(bytes),
},
}
}
// Send Send
func (e *EmailNotidy2) Send(to string, subject string, datafiles map[string]interface{}) error {
t := fasttemplate.New(e.templateCache[e.config.Template.EmailTemplate], "{{", "}}")
htmlBody := t.ExecuteString(datafiles)
m := gomail.NewMessage()
m.SetHeader("From", e.config.Email.FromEmail)
m.SetHeader("Subject", subject)
m.SetBody("text/plain", htmlBody)
sender, err := e.dialer.Dial()
err = sender.Send(e.config.Email.FromEmail, []string{to}, m)
if err != nil {
return err
}
return nil
}
main.go
package main
import (
"demoapp/notify"
"log"
"net/http"
_ "net/http/pprof"
"sync"
)
func main() {
emailnotidy := notify.NewEailNotidy2()
// not working tcp out of order
http.HandleFunc("/send", func(res http.ResponseWriter, req *http.Request) {
res.Write([]byte("send email"))
wg := sync.WaitGroup{}
wg.Add(2)
for i := 0; i < 2; i++ {
go func(wg *sync.WaitGroup) {
defer wg.Done()
err := emailnotidy.Send("dalong@qq.com", "demoapp", map[string]interface{}{
"content": "dalongdemoapp",
})
if err != nil {
log.Println("err:", err.Error())
}
}(&wg)
}
wg.Wait()
})
http.HandleFunc("/send2", func(res http.ResponseWriter, req *http.Request) {
res.Write([]byte("send email"))
for _, to := range []string{
"to1@example1.com",
"to3@example2.com",
"to4@example3.com",
} {
err := emailnotidy.Send(to, "demoapp", map[string]interface{}{
"content": "dalongdemoapp",
})
if err != nil {
log.Println("err:", err.Error())
}
}
})
http.ListenAndServe(":9090", nil)
}
参考资料
https://github.com/rongfengliang/golang-email-learning/tree/v2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-11-22 cube.js 最近的一些更新
2018-11-22 续drone 1.0 新界面调整
2018-11-22 使用kompose 快速转换dokcer-compose 文件为k8s deploy 文件
2016-11-22 k8s DNS 服务发现的一个坑