Initial commit
This commit is contained in:
+101
@@ -0,0 +1,101 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user