2025-02-06 11:14:33 +08:00
package emailhelper
import (
"errors"
"fmt"
"go-admin/config"
"go-admin/pkg/utility"
"regexp"
"sync"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/mailjet/mailjet-apiv3-go"
"go.uber.org/zap"
"gopkg.in/gomail.v2"
)
var (
cacheEmail = make ( map [ string ] * gomail . Dialer )
mu = sync . RWMutex { }
)
// getGoMailIn 邮件连接池
func getGoMailIn ( key string ) * gomail . Dialer {
mu . RLock ( )
defer mu . RUnlock ( )
item , ok := cacheEmail [ key ]
if ok {
return item
}
return nil
}
// CheckIsEmail 检测是否是邮箱
func CheckIsEmail ( email string ) bool {
if email == ` ` {
return false
}
pattern := ` \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* ` // 匹配电子邮箱
reg := regexp . MustCompile ( pattern )
return reg . MatchString ( email )
}
// SendFrontedEmail 发送邮件
func SendFrontedEmail ( toEmail string , code string ) error {
// 邮箱配置
from := config . ExtConfig . EmailConfig . MailFrom // 发送者邮箱
password := config . ExtConfig . EmailConfig . MailSmtpPass // Gmail 密码或应用专用密码
to := toEmail // 收件人邮箱
smtpHost := config . ExtConfig . EmailConfig . MailSmtpHost // Gmail SMTP 服务器
smtpPort := config . ExtConfig . EmailConfig . MailSmtpPort // SMTP 端口
link := fmt . Sprintf ( "%s/verify?email=%s&verify_code=%s&type=register" , config . ExtConfig . Domain , toEmail , code )
// 创建邮件消息
subject := "注册验证"
body := fmt . Sprintf ( "<h1>注册验证</h1><p>您收到此电子邮件,用于进行邮箱验证,请点击下面的链接或打开下面的网址继续。 <p>You have received this email for email verification, please click the link below or open the URL below to continue.</p> %s </p>" , link )
m := gomail . NewMessage ( )
m . SetHeader ( "From" , from ) // 发件人
m . SetHeader ( "To" , to ) // 收件人
m . SetHeader ( "Subject" , subject ) // 邮件主题
m . SetBody ( "text/html" , body ) // 邮件内容(纯文本)
// 设置 SMTP 服务器信息
d := gomail . NewDialer ( smtpHost , utility . StringToInt ( smtpPort ) , from , password )
// 发送邮件
if err := d . DialAndSend ( m ) ; err != nil {
log . Error ( "发送邮件失败: %v" , err )
return err
}
return nil
}
2025-02-19 10:38:29 +08:00
// SendNoticeEmail 发送通知邮件
func SendNoticeEmail ( toEmail string , chain string , symbol string , pair string ) error {
// 邮箱配置
from := config . ExtConfig . EmailConfig . MailFrom // 发送者邮箱
password := config . ExtConfig . EmailConfig . MailSmtpPass // Gmail 密码或应用专用密码
to := toEmail // 收件人邮箱
smtpHost := config . ExtConfig . EmailConfig . MailSmtpHost // Gmail SMTP 服务器
smtpPort := config . ExtConfig . EmailConfig . MailSmtpPort // SMTP 端口
//from = "daichaodsy@163.com"
//password = "QCKTZWTREARMGDZN"
//smtpPort = "465"
//smtpHost = "smtp.163.com"
//link := fmt.Sprintf("%s/verify?email=%s&verify_code=%s&type=register", config.ExtConfig.Domain, toEmail, code)
// 创建邮件消息
subject := "新币发布通知"
body := fmt . Sprintf ( "<h1>代币发布</h1><p> 区块链信息: %s <p> 交易对: %s </p> <p> 合约地址: %s </p> </p>" , chain , symbol , pair )
m := gomail . NewMessage ( )
m . SetHeader ( "From" , from ) // 发件人
m . SetHeader ( "To" , to ) // 收件人
m . SetHeader ( "Subject" , subject ) // 邮件主题
m . SetBody ( "text/html" , body ) // 邮件内容(纯文本)
// 设置 SMTP 服务器信息
d := gomail . NewDialer ( smtpHost , utility . StringToInt ( smtpPort ) , from , password )
// 发送邮件
if err := d . DialAndSend ( m ) ; err != nil {
log . Error ( "发送邮件失败: %v" , err )
return err
}
return nil
}
2025-02-06 11:14:33 +08:00
// SendEmail 发送邮件
//func SendEmail(send config.EmailSend) (string, bool) {
// m := gomail.NewMessage()
// m.SetHeader("From", m.FormatAddress(send.From, send.Username)) // 这里等软件名字定下来以后使用多语言配置具体名称
// m.SetHeader("To", send.To) // "bob@example.com", "cora@example.com")
// // m.SetAddressHeader("Cc", "dan@example.com", "Dan")
// m.SetHeader("Subject", send.Subject)
// m.SetBody("text/html", send.Content) // "Hello <b>Bob</b> and <i>Cora</i>!")
// // m.Attach("/home/Alex/lolcat.jpg")
// key := send.Server + send.From
// gmailClient := getGoMailIn(key)
// if gmailClient == nil {
// mu.Lock()
// d := gomail.NewDialer(send.Server, send.Port, send.From, send.Secret)
// d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
// cacheEmail[key] = d
// mu.Unlock()
// gmailClient = d
// }
//
// // Send the email to Bob, Cora and Dan.
// if err := gmailClient.DialAndSend(m); err != nil {
// log.Error("d.DialAndSend", zap.Error(err))
// return "发送失败", false
// }
//
// return "", true
//}
var (
apiKeyPublic = "00d2889da90d5d90767bf04dc1bdc6fa"
apiKeyPrivate = "f68cd84cd88b7e2aabce79c878a77e97"
)
func MailJetSend ( receive string , code string ) error {
mailjetClient := mailjet . NewMailjetClient ( apiKeyPublic , apiKeyPrivate ) //"00d2889da90d5d90767bf04dc1bdc6fa", "f68cd84cd88b7e2aabce79c878a77e97")
messagesInfo := [ ] mailjet . InfoMessagesV31 {
{
From : & mailjet . RecipientV31 {
Email : "email@tokex.shop" ,
Name : "Tokex" ,
} ,
To : & mailjet . RecipientsV31 {
mailjet . RecipientV31 {
Email : receive ,
Name : "" ,
} ,
} ,
Subject : "【Tokex】邮箱验证码" ,
TextPart : "您的邮箱验证码为:" + code ,
// HTMLPart: "<h3>欢迎注册登录我们的服务, 您的验证码为: 1234567</h3><br />May the delivery force be with you!",
// CustomID: "AppGettingStartedTest",
// TemplateID: 1234,
} ,
}
messages := mailjet . MessagesV31 { Info : messagesInfo }
res , err := mailjetClient . SendMailV31 ( & messages )
if err != nil {
log . Error ( "MailJetSend" , zap . Error ( err ) )
return err
}
// fmt.Printf("Data: %+v\n", res)
if res . ResultsV31 [ 0 ] . Status != "success" {
log . Error ( "发送失败" , zap . Any ( "resilt" , res ) )
return errors . New ( "发送失败" )
}
return nil
}
func MailJetSendMsg ( receive string , subject , textPart string ) error {
mailjetClient := mailjet . NewMailjetClient ( apiKeyPublic , apiKeyPrivate ) //"00d2889da90d5d90767bf04dc1bdc6fa", "f68cd84cd88b7e2aabce79c878a77e97")
messagesInfo := [ ] mailjet . InfoMessagesV31 {
{
From : & mailjet . RecipientV31 {
Email : "email@tokex.shop" ,
Name : "Tokex" ,
} ,
To : & mailjet . RecipientsV31 {
mailjet . RecipientV31 {
Email : receive ,
Name : "" ,
} ,
} ,
Subject : subject ,
TextPart : textPart ,
} ,
}
messages := mailjet . MessagesV31 { Info : messagesInfo }
res , err := mailjetClient . SendMailV31 ( & messages )
if err != nil {
log . Error ( "MailJetSend" , zap . Error ( err ) )
return err
}
// fmt.Printf("Data: %+v\n", res)
if res . ResultsV31 [ 0 ] . Status != "success" {
log . Error ( "发送失败" , zap . Any ( "resilt" , res ) )
return errors . New ( "发送失败" )
}
return nil
}