sender.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package mail
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "github.com/astaxie/beego/logs"
  6. "gopkg.in/gomail.v2"
  7. "net/url"
  8. settings2 "nginx-ui/server/modules/settings"
  9. "strconv"
  10. "strings"
  11. )
  12. type Sender struct {
  13. Server string
  14. Port int
  15. Username string
  16. Password string
  17. Nickname string
  18. Ssl bool
  19. }
  20. func GetDefaultSender() *Sender {
  21. settings := settings2.GetSettings("email")
  22. sender := &Sender{}
  23. for _, v := range settings {
  24. k := v.ConfigKey
  25. if strings.HasSuffix(k, "@server") {
  26. sender.Server = v.ConfigValue
  27. }
  28. if strings.HasSuffix(k, "@port") {
  29. port, err := strconv.Atoi(v.ConfigValue)
  30. if err != nil {
  31. logs.Error("email port is invalid : %s, use 25 replace", v.ConfigValue)
  32. sender.Port = 25
  33. } else {
  34. sender.Port = port
  35. }
  36. }
  37. if strings.HasSuffix(k, "@username") {
  38. sender.Username = v.ConfigValue
  39. }
  40. if strings.HasSuffix(k, "@password") {
  41. sender.Password = v.ConfigValue
  42. }
  43. if strings.HasSuffix(k, "@nickname") {
  44. sender.Nickname = v.ConfigValue
  45. }
  46. if strings.HasSuffix(k, "@ssl") {
  47. sender.Ssl = v.ConfigValue == "Y"
  48. }
  49. }
  50. return sender
  51. }
  52. func SendEmail(to string, subject string, body string, sender *Sender) error {
  53. if sender == nil {
  54. sender = GetDefaultSender()
  55. }
  56. d := gomail.NewDialer(sender.Server, sender.Port, sender.Username, sender.Password)
  57. d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
  58. closer, err := d.Dial()
  59. if err != nil {
  60. logs.Error("dial error: %v", err)
  61. return err
  62. }
  63. defer closer.Close()
  64. m := gomail.NewMessage()
  65. from := fmt.Sprintf("%s <%s>", url.QueryEscape(sender.Nickname), sender.Username)
  66. m.SetHeader("From", from)
  67. m.SetHeader("To", to)
  68. m.SetHeader("Subject", subject)
  69. m.SetBody("text/html", body)
  70. if err := d.DialAndSend(m); err != nil {
  71. logs.Error("send email error: %v", err)
  72. return err
  73. }
  74. return nil
  75. }