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 // 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
- }
|