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

posted on   荣锋亮  阅读(305)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.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 服务发现的一个坑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示