smtp.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package util
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "net/mail"
  6. "net/smtp"
  7. )
  8. const EMAIL_ADMIN_NAME = "郭晓舟"
  9. const EMAIL_ADMIN_ADDRESS = "guoxz@xniao.com.cn"
  10. const EMAIL_ADMIN_PASSWORD = "hanbing540"
  11. const EMAIL_ADMIN_SMTP_SERVER = "smtp.exmail.qq.com"
  12. const EMAIL_ADMIN_SMTP_PORT = 465
  13. type MailList []mail.Address
  14. func (ml MailList) String() string {
  15. s := ""
  16. for _, v := range ml {
  17. s += v.String() + ";"
  18. }
  19. return s[0 : len(s)-1]
  20. }
  21. func SendMail(to MailList, body string, subject string) (bool, error) {
  22. header := make(map[string]string)
  23. from := mail.Address{Name: EMAIL_ADMIN_NAME, Address: EMAIL_ADMIN_ADDRESS}
  24. header["From"] = from.String()
  25. header["To"] = to.String()
  26. header["Subject"] = subject
  27. header["Content-Type"] = "text/plain; charset=UTF-8"
  28. toEmails := []string{}
  29. for _, addr := range to {
  30. toEmails = append(toEmails, addr.Address)
  31. }
  32. // setup the message
  33. message := ""
  34. for k, v := range header {
  35. message += fmt.Sprintf("%s: %s\r\n", k, v)
  36. }
  37. message += "\r\n" + body
  38. conn, err := tls.Dial("tcp", fmt.Sprintf("%s:%d", EMAIL_ADMIN_SMTP_SERVER, EMAIL_ADMIN_SMTP_PORT), nil)
  39. if err != nil {
  40. return false, err
  41. }
  42. smtpClient, err := smtp.NewClient(conn, EMAIL_ADMIN_SMTP_SERVER)
  43. if err != nil {
  44. return false, err
  45. }
  46. auth := smtp.PlainAuth("", EMAIL_ADMIN_ADDRESS, EMAIL_ADMIN_PASSWORD, EMAIL_ADMIN_SMTP_SERVER)
  47. err = smtpClient.Auth(auth)
  48. if err != nil {
  49. return false, err
  50. }
  51. if err = smtpClient.Mail(from.Address); err != nil {
  52. return false, err
  53. }
  54. for _, addr := range to {
  55. if err = smtpClient.Rcpt(addr.Address); err != nil {
  56. return false, err
  57. }
  58. }
  59. w, err := smtpClient.Data()
  60. if err != nil {
  61. return false, err
  62. }
  63. _, err = w.Write([]byte(message))
  64. if err != nil {
  65. return false, err
  66. }
  67. err = w.Close()
  68. if err != nil {
  69. return false, err
  70. }
  71. smtpClient.Quit()
  72. //err := smtp.SendMail(fmt.Sprintf("%s:%d", EMAIL_ADMIN_SMTP_SERVER, EMAIL_ADMIN_SMTP_PORT), auth, EMAIL_ADMIN_ADDRESS, toEmails, []byte(message))
  73. return true, nil
  74. }