123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- package email
- import (
- "crypto/tls"
- "encoding/base64"
- "fmt"
- "net/smtp"
- "strings"
- "xugu_license/internal/models"
- )
- type Email struct {
- from string
- pwd string
- to []string
- subject string
- body string
- smtpPort string
- smtpServer string
- attachment []byte
- attachment2 []byte
- }
- func NewEmail(from string, pwd string, to []string, smtpServer string, smtpPort string, subject string, body string, attachment []byte, attachment2 []byte) *Email {
- return &Email{from: from, pwd: pwd, to: to, smtpServer: smtpServer, smtpPort: smtpPort, subject: subject, body: body, attachment: attachment, attachment2: attachment2}
- }
- func BuildEmail(lic *models.OALicenseInfo, emils []string, licStr []byte, licStr2 string) (*Email, error) {
- var em *Email
- err := CheckEmailFormat(emils)
- if err != nil {
- return nil, err
- }
- if licStr2 == "" {
- body := fmt.Sprintf(" 来自%s项目, 该项目信息:%s\n 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAGLXMName.String, lic.LicInfo.OAXMXXMS.String,
- lic.LicInfo.OAProductName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
- em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
- "465", "来自license消息分发", body, []byte(licStr), nil)
- } else {
- body := fmt.Sprintf(" 来自%s项目, 该项目信息:%s\n 使用%s ,该项目销售:%s, 技术支持:%s", lic.LicInfo.OAGLXMName.String, lic.LicInfo.OAXMXXMS.String,
- lic.LicInfo.OAProductName.String, lic.LicInfo.OASalespersonName.String, lic.LicInfo.OAOperationsPersonName.String)
- em = NewEmail("gt@xugudb.com", "zI7cKadNHv7XedV5", emils, "smtp.sparkspace.huaweicloud.com",
- "465", "来自license消息分发", body, []byte(licStr), []byte(licStr2))
- }
- return em, nil
- }
- func SendEmail(emInfo *Email) error {
-
- var msg strings.Builder
-
- msg.WriteString(fmt.Sprintf("From: %s\r\n", emInfo.from))
- msg.WriteString(fmt.Sprintf("To: %s\r\n", strings.Join(emInfo.to, ",")))
- msg.WriteString(fmt.Sprintf("Subject: %s\r\n", emInfo.subject))
- msg.WriteString("MIME-Version: 1.0\r\n")
- msg.WriteString("Content-Type: multipart/mixed; boundary=BOUNDARY\r\n")
- msg.WriteString("\r\n--BOUNDARY\r\n")
-
- msg.WriteString("Content-Type: text/plain; charset=\"UTF-8\"\r\n")
- msg.WriteString("Content-Transfer-Encoding: 7bit\r\n\r\n")
- msg.WriteString(emInfo.body)
- msg.WriteString("\r\n--BOUNDARY\r\n")
-
- if emInfo.attachment != nil {
- fileData := emInfo.attachment
- encoded := base64.StdEncoding.EncodeToString(fileData)
- msg.WriteString("Content-Type: application/octet-stream\r\n")
- msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license.zip"))
- msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
- msg.WriteString(encoded)
- msg.WriteString("\r\n--BOUNDARY\r\n")
- if emInfo.attachment2 != nil {
- encoded2 := base64.StdEncoding.EncodeToString(emInfo.attachment2)
- msg.WriteString("Content-Type: application/octet-stream\r\n")
- msg.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", "license2.dat"))
- msg.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")
- msg.WriteString(encoded2)
- msg.WriteString("\r\n--BOUNDARY\r\n")
- }
- }
- msg.WriteString("--BOUNDARY--\r\n")
-
-
-
-
-
- conn, err := tls.Dial("tcp", emInfo.smtpServer+":"+emInfo.smtpPort, nil)
- if err != nil {
- fmt.Println("Error connecting to SMTP server:", err)
- return fmt.Errorf("Error connecting to SMTP server:%v", err)
- }
- defer conn.Close()
-
- client, err := smtp.NewClient(conn, emInfo.smtpServer)
- if err != nil {
- fmt.Println("Error creating SMTP client:", err)
- return err
- }
- defer client.Quit()
-
- auth := smtp.PlainAuth("", emInfo.from, emInfo.pwd, emInfo.smtpServer)
- if err := client.Auth(auth); err != nil {
- fmt.Println("Error during SMTP authentication:", err)
- return err
- }
-
-
-
-
-
- for _, to := range emInfo.to {
- fmt.Println("发生的邮箱为:", to)
- if to == "" {
- continue
- }
-
- if err := client.Mail(emInfo.from); err != nil {
- fmt.Println("Error setting sender email:", err)
- return err
- }
- if err := client.Rcpt(to); err != nil {
- fmt.Println("Error setting recipient email:", err)
- return err
- }
-
- writer, err := client.Data()
- if err != nil {
- fmt.Println("Error getting writer:", err)
- return err
- }
- _, err = writer.Write([]byte(msg.String()))
- if err != nil {
- fmt.Println("Error writing email data:", err)
- return err
- }
- err = writer.Close()
- if err != nil {
- fmt.Println("Error closing writer:", err)
- return err
- }
- }
- fmt.Println("Email sent successfully!")
- return nil
- }
- func CheckEmailFormat(emails []string) error {
- for _, email := range emails {
- if !strings.Contains(email, "@") {
- email = ""
- return fmt.Errorf("邮箱格式错误 :%s", email)
- } else {
- fmt.Println("邮箱格式正确")
- }
- }
- return nil
- }
|