email.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package common
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "net/smtp"
  6. "strings"
  7. )
  8. func SendEmail(subject string, receiver string, content string) error {
  9. mail := []byte(fmt.Sprintf("To: %s\r\n"+
  10. "From: %s<%s>\r\n"+
  11. "Subject: %s\r\n"+
  12. "Content-Type: text/html; charset=UTF-8\r\n\r\n%s\r\n",
  13. receiver, SystemName, SMTPAccount, subject, content))
  14. auth := smtp.PlainAuth("", SMTPAccount, SMTPToken, SMTPServer)
  15. addr := fmt.Sprintf("%s:%d", SMTPServer, SMTPPort)
  16. to := strings.Split(receiver, ";")
  17. var err error
  18. if SMTPPort == 465 {
  19. tlsConfig := &tls.Config{
  20. InsecureSkipVerify: true,
  21. ServerName: SMTPServer,
  22. }
  23. conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", SMTPServer, SMTPPort), tlsConfig)
  24. if err != nil {
  25. return err
  26. }
  27. client, err := smtp.NewClient(conn, SMTPServer)
  28. if err != nil {
  29. return err
  30. }
  31. defer client.Close()
  32. if err = client.Auth(auth); err != nil {
  33. return err
  34. }
  35. if err = client.Mail(SMTPAccount); err != nil {
  36. return err
  37. }
  38. receiverEmails := strings.Split(receiver, ";")
  39. for _, receiver := range receiverEmails {
  40. if err = client.Rcpt(receiver); err != nil {
  41. return err
  42. }
  43. }
  44. w, err := client.Data()
  45. if err != nil {
  46. return err
  47. }
  48. _, err = w.Write(mail)
  49. if err != nil {
  50. return err
  51. }
  52. err = w.Close()
  53. if err != nil {
  54. return err
  55. }
  56. } else {
  57. err = smtp.SendMail(addr, auth, SMTPAccount, to, mail)
  58. }
  59. return err
  60. }