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 // SMTP服务器端口 smtpServer string // SMTP服务器地址 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} } // emInfo := Email{ // from: "gt@xugudb.com", // pwd: "zI7cKadNHv7XedV5", // to: []string{"346614213@qq.com", "2293851987@qq.com"}, // smtpServer: "smtp.sparkspace.huaweicloud.com", // smtpPort: "465", // } // 邮件服务器配置 //smtpServer := "smtp.sparkspace.huaweicloud.com" //smtpPort := "465" //from := "gt@xugudb.com" //password := "zI7cKadNHv7XedV5" // 接收者邮箱地址 //to := "346614213@qq.com" // 邮件内容 // subject := "Subject: Test email\n" // body := "This is a test email sent using Go and SSL." func BuildEmail(lic *models.OALicenseInfo, emils []string, licStr string, 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.dat")) 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") // mime := "MIME-version: 1.0;\nContent-Type: text/plain; charset=\"UTF-8\";\n\n" // subjectHeader := fmt.Sprintf("Subject: %s\r\n", emInfo.subject) // 构建邮件内容 // msg := []byte(subjectHeader + mime + emInfo.body) // 连接到 SMTP 服务器 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() // 创建 SMTP 客户端 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 } // 设置发件人和收件人 // if err := client.Mail(emInfo.from); err != nil { // fmt.Println("Error setting sender email:", err) // return // } 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 } // CheckEmailFormat 检查邮箱格式 func CheckEmailFormat(emails []string) error { for _, email := range emails { if !strings.Contains(email, "@") { email = "" return fmt.Errorf("邮箱格式错误 :%s", email) } else { fmt.Println("邮箱格式正确") } } return nil }