email.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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\n 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAGLXMName.String, lic.LicInfo.OAXMXXMS.String,
  49. lic.LicInfo.OAProductName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
  50. em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
  51. "465", "来自license消息分发", body, []byte(licStr), nil)
  52. } else {
  53. body := fmt.Sprintf(" 来自%s项目, 该项目信息:%s\n 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAGLXMName.String, lic.LicInfo.OAXMXXMS.String,
  54. lic.LicInfo.OAProductName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
  55. em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
  56. "465", "来自license消息分发", body, []byte(licStr), []byte(licStr2))
  57. }
  58. return em, nil
  59. }
  60. func SendEmail(emInfo *Email) error {
  61. // 创建邮件内容
  62. var msg strings.Builder
  63. // 设置邮件头
  64. msg.WriteString(fmt.Sprintf("From: %s\r\n", emInfo.from))
  65. msg.WriteString(fmt.Sprintf("To: %s\r\n", strings.Join(emInfo.to, ",")))
  66. msg.WriteString(fmt.Sprintf("Subject: %s\r\n", emInfo.subject))
  67. msg.WriteString("MIME-Version: 1.0\r\n")
  68. msg.WriteString("Content-Type: multipart/mixed; boundary=BOUNDARY\r\n")
  69. msg.WriteString("\r\n--BOUNDARY\r\n")
  70. // 添加邮件正文
  71. msg.WriteString("Content-Type: text/plain; charset=\"UTF-8\"\r\n")
  72. msg.WriteString("Content-Transfer-Encoding: 7bit\r\n\r\n")
  73. msg.WriteString(emInfo.body)
  74. msg.WriteString("\r\n--BOUNDARY\r\n")
  75. // 添加附件
  76. if emInfo.attachment != nil {
  77. fileData := emInfo.attachment
  78. encoded := base64.StdEncoding.EncodeToString(fileData)
  79. msg.WriteString("Content-Type: application/octet-stream\r\n")
  80. msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license.dat"))
  81. msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
  82. msg.WriteString(encoded)
  83. msg.WriteString("\r\n--BOUNDARY\r\n")
  84. if emInfo.attachment2 != nil {
  85. encoded2 := base64.StdEncoding.EncodeToString(emInfo.attachment2)
  86. msg.WriteString("Content-Type: application/octet-stream\r\n")
  87. msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license2.dat"))
  88. msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
  89. msg.WriteString(encoded2)
  90. msg.WriteString("\r\n--BOUNDARY\r\n")
  91. }
  92. }
  93. msg.WriteString("--BOUNDARY--\r\n")
  94. // mime := "MIME-version: 1.0;\nContent-Type: text/plain; charset=\"UTF-8\";\n\n"
  95. // subjectHeader := fmt.Sprintf("Subject: %s\r\n", emInfo.subject)
  96. // 构建邮件内容
  97. // msg := []byte(subjectHeader + mime + emInfo.body)
  98. // 连接到 SMTP 服务器
  99. conn, err := tls.Dial("tcp", emInfo.smtpServer+":"+emInfo.smtpPort, nil)
  100. if err != nil {
  101. fmt.Println("Error connecting to SMTP server:", err)
  102. return fmt.Errorf("Error connecting to SMTP server:%v", err)
  103. }
  104. defer conn.Close()
  105. // 创建 SMTP 客户端
  106. client, err := smtp.NewClient(conn, emInfo.smtpServer)
  107. if err != nil {
  108. fmt.Println("Error creating SMTP client:", err)
  109. return err
  110. }
  111. defer client.Quit()
  112. // 进行身份验证
  113. auth := smtp.PlainAuth("", emInfo.from, emInfo.pwd, emInfo.smtpServer)
  114. if err := client.Auth(auth); err != nil {
  115. fmt.Println("Error during SMTP authentication:", err)
  116. return err
  117. }
  118. // 设置发件人和收件人
  119. // if err := client.Mail(emInfo.from); err != nil {
  120. // fmt.Println("Error setting sender email:", err)
  121. // return
  122. // }
  123. for _, to := range emInfo.to {
  124. fmt.Println("发生的邮箱为:", to)
  125. if to == "" {
  126. continue
  127. }
  128. // 每次设置发件人
  129. if err := client.Mail(emInfo.from); err != nil {
  130. fmt.Println("Error setting sender email:", err)
  131. return err
  132. }
  133. if err := client.Rcpt(to); err != nil {
  134. fmt.Println("Error setting recipient email:", err)
  135. return err
  136. }
  137. // 发送邮件数据
  138. writer, err := client.Data()
  139. if err != nil {
  140. fmt.Println("Error getting writer:", err)
  141. return err
  142. }
  143. _, err = writer.Write([]byte(msg.String()))
  144. if err != nil {
  145. fmt.Println("Error writing email data:", err)
  146. return err
  147. }
  148. err = writer.Close()
  149. if err != nil {
  150. fmt.Println("Error closing writer:", err)
  151. return err
  152. }
  153. }
  154. fmt.Println("Email sent successfully!")
  155. return nil
  156. }
  157. // CheckEmailFormat 检查邮箱格式
  158. func CheckEmailFormat(emails []string) error {
  159. for _, email := range emails {
  160. if !strings.Contains(email, "@") {
  161. email = ""
  162. return fmt.Errorf("邮箱格式错误 :%s", email)
  163. } else {
  164. fmt.Println("邮箱格式正确")
  165. }
  166. }
  167. return nil
  168. }