mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-10-31 08:29:33 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package admin
 | |
| 
 | |
| import (
 | |
| 	"crypto/tls"
 | |
| 	"errors"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/bjdgyc/anylink/base"
 | |
| 	"github.com/bjdgyc/anylink/dbdata"
 | |
| 	"github.com/golang-jwt/jwt/v4"
 | |
| 	mail "github.com/xhit/go-simple-mail/v2"
 | |
| 	// "github.com/mojocn/base64Captcha"
 | |
| )
 | |
| 
 | |
| func SetJwtData(data map[string]interface{}, expiresAt int64) (string, error) {
 | |
| 	jwtData := jwt.MapClaims{"exp": expiresAt}
 | |
| 	for k, v := range data {
 | |
| 		jwtData[k] = v
 | |
| 	}
 | |
| 	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwtData)
 | |
| 
 | |
| 	// Sign and get the complete encoded token as a string using the secret
 | |
| 	tokenString, err := token.SignedString([]byte(base.Cfg.JwtSecret))
 | |
| 	return tokenString, err
 | |
| }
 | |
| 
 | |
| func GetJwtData(jwtToken string) (map[string]interface{}, error) {
 | |
| 	token, err := jwt.Parse(jwtToken, func(token *jwt.Token) (interface{}, error) {
 | |
| 		// since we only use the one private key to sign the tokens,
 | |
| 		// we also only use its public counter part to verify
 | |
| 		return []byte(base.Cfg.JwtSecret), nil
 | |
| 	})
 | |
| 
 | |
| 	if err != nil || !token.Valid {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	claims, ok := token.Claims.(jwt.MapClaims)
 | |
| 	if !ok {
 | |
| 		return nil, errors.New("data is parse err")
 | |
| 	}
 | |
| 
 | |
| 	return claims, nil
 | |
| }
 | |
| 
 | |
| func SendMail(subject, to, htmlBody string) error {
 | |
| 
 | |
| 	dataSmtp := &dbdata.SettingSmtp{}
 | |
| 	err := dbdata.SettingGet(dataSmtp)
 | |
| 	if err != nil {
 | |
| 		base.Error(err)
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	server := mail.NewSMTPClient()
 | |
| 
 | |
| 	// SMTP Server
 | |
| 	server.Host = dataSmtp.Host
 | |
| 	server.Port = dataSmtp.Port
 | |
| 	server.Username = dataSmtp.Username
 | |
| 	server.Password = dataSmtp.Password
 | |
| 
 | |
| 	switch dataSmtp.Encryption {
 | |
| 	case "SSLTLS":
 | |
| 		server.Encryption = mail.EncryptionSSLTLS
 | |
| 	case "STARTTLS":
 | |
| 		server.Encryption = mail.EncryptionSTARTTLS
 | |
| 	default:
 | |
| 		server.Encryption = mail.EncryptionNone
 | |
| 	}
 | |
| 
 | |
| 	// Since v2.3.0 you can specified authentication type:
 | |
| 	// - PLAIN (default)
 | |
| 	// - LOGIN
 | |
| 	// - CRAM-MD5
 | |
| 	server.Authentication = mail.AuthPlain
 | |
| 
 | |
| 	// Variable to keep alive connection
 | |
| 	server.KeepAlive = false
 | |
| 
 | |
| 	// Timeout for connect to SMTP Server
 | |
| 	server.ConnectTimeout = 10 * time.Second
 | |
| 
 | |
| 	// Timeout for send the data and wait respond
 | |
| 	server.SendTimeout = 10 * time.Second
 | |
| 
 | |
| 	// Set TLSConfig to provide custom TLS configuration. For example,
 | |
| 	// to skip TLS verification (useful for testing):
 | |
| 	server.TLSConfig = &tls.Config{InsecureSkipVerify: true}
 | |
| 
 | |
| 	// SMTP client
 | |
| 	smtpClient, err := server.Connect()
 | |
| 
 | |
| 	if err != nil {
 | |
| 		base.Error(err)
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	// New email simple html with inline and CC
 | |
| 	email := mail.NewMSG()
 | |
| 	email.SetFrom(dataSmtp.From).
 | |
| 		AddTo(to).
 | |
| 		SetSubject(subject)
 | |
| 
 | |
| 	email.SetBody(mail.TextHTML, htmlBody)
 | |
| 
 | |
| 	// Call Send and pass the client
 | |
| 	err = email.Send(smtpClient)
 | |
| 	if err != nil {
 | |
| 		base.Error(err)
 | |
| 	}
 | |
| 
 | |
| 	return err
 | |
| }
 |