go发送邮件

412 阅读2分钟

发送邮件也是比较常见的需求,如后期订单相关的业务,告警相关的业务,发送邮件通信相关的业务等!!!

在网上找的自己试了一下,感谢前辈

package main

import (
	"fmt"
	"mime"

	"gopkg.in/gomail.v2"
)

/*
go邮件发送
*/

func SendMail(mailTo []string, subject string, body string) error {
	// 设置邮箱主体
	mailConn := map[string]string{
		"user": "xxx@qq.com",  //发送人邮箱(邮箱以自己的为准)
		"pass": "xxx",         //发送人邮箱的密码,现在可能会需要邮箱 开启授权密码后在pass填写授权码
		"host": "smtp.qq.com", //邮箱服务器(此时用的是qq邮箱)
	}

	m := gomail.NewMessage(
		//发送文本时设置编码,防止乱码。 如果txt文本设置了之后还是乱码,那可以将原txt文本在保存时
		//就选择utf-8格式保存
		gomail.SetEncoding(gomail.Base64),
	)
	m.SetHeader("From", m.FormatAddress(mailConn["user"], "LLL")) // 添加别名
	m.SetHeader("To", mailTo...)                                  // 发送给用户(可以多个)
	m.SetHeader("Subject", subject)                               // 设置邮件主题
	m.SetBody("text/html", body)                                  // 设置邮件正文

	//一个文件(加入发送一个 txt 文件):/tmp/foo.txt,我需要将这个文件以邮件附件的方式进行发送,同时指定附件名为:附件.txt
	//同时解决了文件名乱码问题
	name := "附件.txt"
	m.Attach("./gomail.txt",
		gomail.Rename(name), //重命名
		gomail.SetHeader(map[string][]string{
			"Content-Disposition": []string{
				fmt.Sprintf(`attachment; filename="%s"`, mime.QEncoding.Encode("UTF-8", name)),
			},
		}),
	)

	/*
	   创建SMTP客户端,连接到远程的邮件服务器,需要指定服务器地址、端口号、用户名、密码,如果端口号为465的话,
	   自动开启SSL,这个时候需要指定TLSConfig
	*/
	d := gomail.NewDialer(mailConn["host"], 465, mailConn["user"], mailConn["pass"]) // 设置邮件正文
	//d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
	err := d.DialAndSend(m)
	return err
}

func main() {
	// 邮件接收方
	mailTo := []string{
		//可以是多个接收人
		"xxx@163.com",
		"xxx@qq.com",
	}

	subject := "Hello World!" // 邮件主题
	body := "测试发送邮件"          // 邮件正文

	err := SendMail(mailTo, subject, body)
	if err != nil {
		fmt.Println("Send fail! - ", err)
		return
	}
	fmt.Println("Send successfully!")
}

gin 中间件

  func SendMail(mailTo string, subject string, body string) error {
  

     if config.ErrorNotifyOpen != 1 {
         return nil
     }


     m := gomail.NewMessage()


     //设置发件人
     m.SetHeader("From", config.SystemEmailUser)


     //设置发送给多个用户
     mailArrTo := strings.Split(mailTo, ",")
     m.SetHeader("To", mailArrTo...)


     //设置邮件主题`
     m.SetHeader("Subject", subject)


     //设置邮件正文
     m.SetBody("text/html", body)


      d := gomail.NewDialer(config.SystemEmailHost, config.SystemEmailPort, config.SystemEmailUser, config.SystemEmailPass)


     err := d.DialAndSend(m)
     if err != nil {
         fmt.Println(err)
     }
     return err
 }
 
 
  func SetUp() gin.HandlerFunc {
  

     return func(c *gin.Context) {
         defer func() {
             if err := recover(); err != nil {


                 DebugStack := ""
                 for _, v := range strings.Split(string(debug.Stack()), "\n") {
                     DebugStack += v + "<br>"
                 }


             subject := fmt.Sprintf("【重要错误】%s 项目出错了!", config.AppName)


              body := strings.ReplaceAll(MailTemplate, "{ErrorMsg}", fmt.Sprintf("%s", err))
              body = strings.ReplaceAll(body, "{RequestTime}", util.GetCurrentDate())
              body = strings.ReplaceAll(body, "{RequestURL}", c.Request.Method + " " + c.Request.Host + c.Request.RequestURI)
              body = strings.ReplaceAll(body, "{RequestUA}", c.Request.UserAgent())
              body = strings.ReplaceAll(body, "{RequestIP}", c.ClientIP())
              body = strings.ReplaceAll(body, "{DebugStack}", DebugStack)


              _ = util.SendMail(config.ErrorNotifyUser, subject, body)


              utilGin := util.Gin{Ctx: c}
              utilGin.Response(500, "系统异常,请联系管理员!", nil)
              }
          }()
      c.Next()
      }
  }