send.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package email
  2. import (
  3. "scd_check_tools/conf"
  4. "scd_check_tools/logger"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "io/ioutil"
  9. "os"
  10. "strconv"
  11. "strings"
  12. "gopkg.in/gomail.v2"
  13. )
  14. var EmailConfig = new(emailConfig)
  15. //邮件配置
  16. type emailConfig struct {
  17. Enable bool //是否启动邮件
  18. SmtpHost string `json:"smtp_host"`
  19. SmtpPort string `json:"smtp_port"`
  20. Username string `json:"send_email"` //发送邮件邮箱
  21. SendNickname string `json:"send_nickname"` //发送者名称
  22. AuthCode string `json:"auth_code"` //发送授权码。需要在邮件平台上生成
  23. }
  24. func (c *emailConfig) Load() {
  25. cnffile := "conf/email.cnf"
  26. logger.Logger.Println("加载Email配置文件:" + cnffile)
  27. fileHanlder, err := os.Open(cnffile)
  28. if err != nil {
  29. logger.Logger.Println("未发现邮件配置:conf/email.cnf")
  30. return
  31. }
  32. txt, err := ioutil.ReadAll(fileHanlder)
  33. if err != nil {
  34. logger.Logger.Error(err)
  35. return
  36. }
  37. defer fileHanlder.Close()
  38. txtStr := string(txt)
  39. if txtStr == "" {
  40. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确"))
  41. return
  42. }
  43. err = json.Unmarshal(txt, &EmailConfig)
  44. if err != nil {
  45. logger.Logger.Error(err)
  46. return
  47. }
  48. if EmailConfig.SmtpHost == "" {
  49. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确:smtp_host为空!"))
  50. return
  51. }
  52. if EmailConfig.SmtpPort == "" {
  53. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确:smtp_port为空!"))
  54. return
  55. }
  56. _, err = strconv.Atoi(EmailConfig.SmtpPort)
  57. if err != nil {
  58. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确:smtp_port不是正确的端口号!"))
  59. return
  60. }
  61. if EmailConfig.Username == "" {
  62. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确:send_email为空!"))
  63. return
  64. }
  65. if EmailConfig.AuthCode == "" {
  66. logger.Logger.Error(errors.New("邮件配置文件conf/email.cnf内容不正确:auth_code为空!"))
  67. return
  68. }
  69. if EmailConfig.SendNickname == "" {
  70. EmailConfig.SendNickname = conf.GlobalConfig["appname"]
  71. }
  72. EmailConfig.Enable = true
  73. logger.Logger.Debug(fmt.Sprintf("邮件配置文件加载完成:%+v", EmailConfig))
  74. }
  75. //邮件发送对象。
  76. //暂不支持附件发送
  77. type Send struct {
  78. //接收邮箱
  79. ToEmail string
  80. //抄送邮箱列表
  81. CcEmails []string
  82. //邮件标题
  83. Subject string
  84. //邮件正文内容
  85. Content string
  86. }
  87. //邮件发送
  88. func (c *Send) To() error {
  89. return c.SendEmail(c.ToEmail, c.Subject, c.Content, c.CcEmails)
  90. }
  91. //邮件发送
  92. func (c *Send) SendEmail(toEmail, subject, content string, cc ...[]string) error {
  93. if !EmailConfig.Enable {
  94. return nil
  95. }
  96. if toEmail == "" {
  97. return errors.New("接收邮箱不能为空!")
  98. }
  99. if subject == "" {
  100. subject = "无标题"
  101. }
  102. if content == "" {
  103. return errors.New("邮件内容不能为空!")
  104. }
  105. s := gomail.NewMessage()
  106. s.SetHeader("From", s.FormatAddress(EmailConfig.Username, EmailConfig.SendNickname))
  107. s.SetHeader("To", toEmail)
  108. s.SetHeader("Subject", subject)
  109. if len(cc) > 0 {
  110. s.SetHeader("Cc", strings.Join(cc[0], ","))
  111. }
  112. //附件
  113. //s.Attach("")
  114. s.SetBody("text/html", content)
  115. port, _ := strconv.Atoi(EmailConfig.SmtpPort)
  116. s1 := gomail.NewDialer(EmailConfig.SmtpHost, port, EmailConfig.Username, EmailConfig.AuthCode)
  117. err := s1.DialAndSend(s)
  118. if err != nil {
  119. return err
  120. }
  121. return nil
  122. }