Files
soft_usite/config/mail.go
T
2025-04-24 02:07:47 +00:00

102 lines
3.1 KiB
Go
Executable File

package config
import (
"fmt"
"log"
"os"
"time"
"github.com/gofiber/fiber/v2"
"github.com/valyala/bytebufferpool"
mail "github.com/xhit/go-simple-mail/v2"
)
type Mail struct {
*mail.SMTPServer
*mail.SMTPClient
Host string `mapstructure:"MAIL_HOST" yaml:"host" env:"MAIL_HOST" env-default:"smtp-mail.outlook.com"`
Username string `mapstructure:"MAIL_USERNAME" yaml:"username" env:"MAIL_USERNAME" env-default:"ovirtual@gasesdeloriente.com.co"`
Password string `mapstructure:"MAIL_PASSWORD" yaml:"password" env:"MAIL_PASSWORD" env-default:"Gases2023**"`
Encryption string `mapstructure:"MAIL_ENCRYPTION" yaml:"encryption" env:"MAIL_ENCRYPTION" env-default:"tls"`
FromAddress string `mapstructure:"MAIL_FROM_ADDRESS" yaml:"from_address" env:"MAIL_FROM_ADDRESS" env-default:"ovirtual@gasesdeloriente.com.co"`
FromName string `mapstructure:"MAIL_FROM_NAME" yaml:"from_name" env:"MAIL_FROM_NAME" env-default:"Gases"`
View *ViewConfig
Port int `mapstructure:"MAIL_PORT" yaml:"port" env:"MAIL_PORT" env-default:"587"` // Cambié a 465 para SSL
}
// Enviar correo
func (m *Mail) Send(to string, subject string, body string, ccEmails ...string) error {
// Configurar el cliente SMTP antes de enviar cada correo
if m.SMTPServer == nil {
m.SetupMailer()
}
// Obtener el remitente desde el archivo .env
from := os.Getenv("MAIL_FROM_ADDRESS")
if from == "" {
log.Println("Error: MAIL_FROM_ADDRESS no está configurado en el archivo .env")
return fmt.Errorf("MAIL_FROM_ADDRESS no está configurado")
}
// Crear nuevo mensaje de correo
email := mail.NewMSG()
email.SetFrom(from).
AddTo(to).
SetSubject(subject).
SetBody(mail.TextHTML, body)
// Crear un nuevo cliente SMTP
client, err := m.SMTPServer.Connect()
if err != nil {
log.Printf("Error conectando al servidor SMTP: %s", err)
return err
}
// Enviar el correo usando el cliente SMTP nuevo
err = email.Send(client)
if err != nil {
log.Printf("Error enviando el correo: %s", err)
return err
}
log.Println("Correo enviado con éxito")
return nil
}
// Preparar HTML para el cuerpo del correo
func (m *Mail) PrepareHtml(view string, body fiber.Map) string {
buf := bytebufferpool.Get()
defer bytebufferpool.Put(buf)
// app.Settings.Views.Render (asegúrate de que el motor de plantillas esté configurado)
if err := m.View.Template.TemplateEngine.Render(buf, view, body, "layouts/email"); err != nil {
log.Printf("Error rendering HTML: %s", err)
}
return buf.String()
}
// Configuración inicial del cliente SMTP
func (m *Mail) SetupMailer() {
var err error
m.SMTPServer = mail.NewSMTPClient()
m.SMTPServer.Host = m.Host
m.SMTPServer.Port = m.Port
m.SMTPServer.Username = m.Username
m.SMTPServer.Password = m.Password
if m.Encryption == "tls" {
m.SMTPServer.Encryption = mail.EncryptionTLS
} else {
m.SMTPServer.Encryption = mail.EncryptionSSL
}
// Configuración de tiempo y conexión
m.SMTPServer.KeepAlive = false
m.SMTPServer.ConnectTimeout = 10 * time.Second
m.SMTPServer.SendTimeout = 10 * time.Second
// Conectar al servidor SMTP
m.SMTPClient, err = m.SMTPServer.Connect()
if err != nil {
log.Printf("Error conectando al servidor SMTP: %s", err)
}
}