77 lines
1.3 KiB
Go
77 lines
1.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/charmbracelet/log"
|
|
"github.com/wneessen/go-mail"
|
|
)
|
|
|
|
type MailClient struct {
|
|
client *mail.Client
|
|
}
|
|
|
|
type TestMailClient struct {
|
|
logger *log.Logger
|
|
}
|
|
|
|
type Mailer interface {
|
|
SendCode(to string, code string) error
|
|
}
|
|
|
|
func (m MailClient) getMessage() (*mail.Msg, error) {
|
|
message := mail.NewMsg()
|
|
if err := message.From("auth@johncosta.tech"); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return message, nil
|
|
}
|
|
|
|
func (m MailClient) SendCode(to string, code string) error {
|
|
msg, err := m.getMessage()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := msg.To(to); err != nil {
|
|
return err
|
|
}
|
|
|
|
msg.Subject("Login to Haystack")
|
|
msg.SetBodyString(mail.TypeTextPlain, code)
|
|
|
|
return m.client.DialAndSend(msg)
|
|
}
|
|
|
|
func (m TestMailClient) SendCode(to string, code string) error {
|
|
m.logger.Info("Auth Code", "email", to, "code", code)
|
|
|
|
return nil
|
|
}
|
|
|
|
func CreateMailClient(log *log.Logger) (Mailer, error) {
|
|
mode := os.Getenv("MODE")
|
|
if mode == "DEV" {
|
|
return TestMailClient{
|
|
log,
|
|
}, nil
|
|
}
|
|
|
|
client, err := mail.NewClient(
|
|
"smtp.mailbox.org",
|
|
mail.WithTLSPortPolicy(mail.TLSMandatory),
|
|
mail.WithSMTPAuth(mail.SMTPAuthPlain),
|
|
mail.WithUsername(os.Getenv("EMAIL_USERNAME")),
|
|
mail.WithPassword(os.Getenv("EMAIL_PASSWORD")),
|
|
)
|
|
|
|
if err != nil {
|
|
return MailClient{}, err
|
|
}
|
|
|
|
return MailClient{
|
|
client: client,
|
|
}, nil
|
|
}
|