email.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package email
  2. import (
  3. "crypto/tls"
  4. "encoding/base64"
  5. "fmt"
  6. "net/smtp"
  7. "strings"
  8. "xugu_license/internal/models"
  9. )
  10. type Email struct {
  11. from string // 发件人邮箱
  12. pwd string
  13. to []string // 收件人邮箱列表
  14. subject string // 邮件主题
  15. body string // 邮件内容
  16. smtpPort string // SMTP服务器端口
  17. smtpServer string // SMTP服务器地址
  18. attachment []byte // 附件
  19. attachment2 []byte // 附件
  20. }
  21. func NewEmail(from string, pwd string, to []string, smtpServer string, smtpPort string, subject string, body string, attachment []byte, attachment2 []byte) *Email {
  22. return &Email{from: from, pwd: pwd, to: to, smtpServer: smtpServer, smtpPort: smtpPort, subject: subject, body: body, attachment: attachment, attachment2: attachment2}
  23. }
  24. // emInfo := Email{
  25. // from: "gt@xugudb.com",
  26. // pwd: "zI7cKadNHv7XedV5",
  27. // to: []string{"346614213@qq.com", "2293851987@qq.com"},
  28. // smtpServer: "smtp.sparkspace.huaweicloud.com",
  29. // smtpPort: "465",
  30. // }
  31. // 邮件服务器配置
  32. //smtpServer := "smtp.sparkspace.huaweicloud.com"
  33. //smtpPort := "465"
  34. //from := "gt@xugudb.com"
  35. //password := "zI7cKadNHv7XedV5"
  36. // 接收者邮箱地址
  37. //to := "346614213@qq.com"
  38. // 邮件内容
  39. // subject := "Subject: Test email\n"
  40. // body := "This is a test email sent using Go and SSL."
  41. func BuildEmail(lic *models.OALicenseInfo, emils []string, licStr string, licStr2 string) (*Email, error) {
  42. var em *Email
  43. err := CheckEmailFormat(emils)
  44. if err != nil {
  45. return nil, err
  46. }
  47. if licStr2 == "" {
  48. body := fmt.Sprintf(" 来自%s 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAXMXXMS.String, lic.LicInfo.OAGLXMName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
  49. em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
  50. "465", "来自license消息分发", body, []byte(licStr), nil)
  51. } else {
  52. body := fmt.Sprintf(" 来自%s 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAXMXXMS.String, lic.LicInfo.OAGLXMName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
  53. em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
  54. "465", "来自license消息分发", body, []byte(licStr), []byte(licStr2))
  55. }
  56. return em, nil
  57. }
  58. func SendEmail(emInfo *Email) error {
  59. // 创建邮件内容
  60. var msg strings.Builder
  61. // 设置邮件头
  62. msg.WriteString(fmt.Sprintf("From: %s\r\n", emInfo.from))
  63. msg.WriteString(fmt.Sprintf("To: %s\r\n", strings.Join(emInfo.to, ",")))
  64. msg.WriteString(fmt.Sprintf("Subject: %s\r\n", emInfo.subject))
  65. msg.WriteString("MIME-Version: 1.0\r\n")
  66. msg.WriteString("Content-Type: multipart/mixed; boundary=BOUNDARY\r\n")
  67. msg.WriteString("\r\n--BOUNDARY\r\n")
  68. // 添加邮件正文
  69. msg.WriteString("Content-Type: text/plain; charset=\"UTF-8\"\r\n")
  70. msg.WriteString("Content-Transfer-Encoding: 7bit\r\n\r\n")
  71. msg.WriteString(emInfo.body)
  72. msg.WriteString("\r\n--BOUNDARY\r\n")
  73. // 添加附件
  74. if emInfo.attachment != nil {
  75. fileData := emInfo.attachment
  76. encoded := base64.StdEncoding.EncodeToString(fileData)
  77. msg.WriteString("Content-Type: application/octet-stream\r\n")
  78. msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license.dat"))
  79. msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
  80. msg.WriteString(encoded)
  81. msg.WriteString("\r\n--BOUNDARY\r\n")
  82. if emInfo.attachment2 != nil {
  83. encoded2 := base64.StdEncoding.EncodeToString(emInfo.attachment2)
  84. msg.WriteString("Content-Type: application/octet-stream\r\n")
  85. msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license2.dat"))
  86. msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
  87. msg.WriteString(encoded2)
  88. msg.WriteString("\r\n--BOUNDARY\r\n")
  89. }
  90. }
  91. msg.WriteString("--BOUNDARY--\r\n")
  92. // mime := "MIME-version: 1.0;\nContent-Type: text/plain; charset=\"UTF-8\";\n\n"
  93. // subjectHeader := fmt.Sprintf("Subject: %s\r\n", emInfo.subject)
  94. // 构建邮件内容
  95. // msg := []byte(subjectHeader + mime + emInfo.body)
  96. // 连接到 SMTP 服务器
  97. conn, err := tls.Dial("tcp", emInfo.smtpServer+":"+emInfo.smtpPort, nil)
  98. if err != nil {
  99. fmt.Println("Error connecting to SMTP server:", err)
  100. return fmt.Errorf("Error connecting to SMTP server:%v", err)
  101. }
  102. defer conn.Close()
  103. // 创建 SMTP 客户端
  104. client, err := smtp.NewClient(conn, emInfo.smtpServer)
  105. if err != nil {
  106. fmt.Println("Error creating SMTP client:", err)
  107. return err
  108. }
  109. defer client.Quit()
  110. // 进行身份验证
  111. auth := smtp.PlainAuth("", emInfo.from, emInfo.pwd, emInfo.smtpServer)
  112. if err := client.Auth(auth); err != nil {
  113. fmt.Println("Error during SMTP authentication:", err)
  114. return err
  115. }
  116. // 设置发件人和收件人
  117. // if err := client.Mail(emInfo.from); err != nil {
  118. // fmt.Println("Error setting sender email:", err)
  119. // return
  120. // }
  121. for _, to := range emInfo.to {
  122. fmt.Println("发生的邮箱为:", to)
  123. if to == "" {
  124. continue
  125. }
  126. // 每次设置发件人
  127. if err := client.Mail(emInfo.from); err != nil {
  128. fmt.Println("Error setting sender email:", err)
  129. return err
  130. }
  131. if err := client.Rcpt(to); err != nil {
  132. fmt.Println("Error setting recipient email:", err)
  133. return err
  134. }
  135. // 发送邮件数据
  136. writer, err := client.Data()
  137. if err != nil {
  138. fmt.Println("Error getting writer:", err)
  139. return err
  140. }
  141. _, err = writer.Write([]byte(msg.String()))
  142. if err != nil {
  143. fmt.Println("Error writing email data:", err)
  144. return err
  145. }
  146. err = writer.Close()
  147. if err != nil {
  148. fmt.Println("Error closing writer:", err)
  149. return err
  150. }
  151. }
  152. fmt.Println("Email sent successfully!")
  153. return nil
  154. }
  155. // CheckEmailFormat 检查邮箱格式
  156. func CheckEmailFormat(emails []string) error {
  157. for _, email := range emails {
  158. if !strings.Contains(email, "@") {
  159. email = ""
  160. return fmt.Errorf("邮箱格式错误 :%s", email)
  161. } else {
  162. fmt.Println("邮箱格式正确")
  163. }
  164. }
  165. return nil
  166. }