basic common app packages
This commit is contained in:
89
email/transport_smtp.go
Normal file
89
email/transport_smtp.go
Normal file
@@ -0,0 +1,89 @@
|
||||
// Copyright 2024 Patial Tech (Ankit Patial).
|
||||
// All rights reserved.
|
||||
|
||||
package email
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"strings"
|
||||
|
||||
"code.patial.tech/go/appcore/email/gomail"
|
||||
"code.patial.tech/go/appcore/uid"
|
||||
)
|
||||
|
||||
// SMTP mailer
|
||||
type SMTP struct {
|
||||
Host string
|
||||
Port int
|
||||
Username string
|
||||
Password string
|
||||
// Domain name for smtp
|
||||
Domain string
|
||||
}
|
||||
|
||||
func (t SMTP) Send(msg *Message) error {
|
||||
slog.Info("sending mail", slog.String("smtp", t.Host))
|
||||
// validate msg
|
||||
if err := msg.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
toCount := len(msg.To)
|
||||
m := gomail.NewMessage()
|
||||
if msg.ID != "" {
|
||||
m.SetHeader("Message-ID", fmt.Sprintf("<%s>", msg.ID))
|
||||
} else {
|
||||
uid, err := uid.NewUUID()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
id := strings.Replace(uid, "-", "", -1)
|
||||
msgID := fmt.Sprintf("<autogen-%s@%s>", id, t.Domain)
|
||||
m.SetHeader("Message-ID", msgID)
|
||||
}
|
||||
|
||||
m.SetHeader("From", msg.From)
|
||||
|
||||
// TO
|
||||
to := make([]string, toCount)
|
||||
for i, address := range msg.To {
|
||||
to[i] = address.String()
|
||||
}
|
||||
m.SetHeader("To", to...)
|
||||
|
||||
// subject
|
||||
m.SetHeader("Subject", msg.Subject)
|
||||
|
||||
// CC
|
||||
ccCount := len(msg.Cc)
|
||||
if ccCount > 0 {
|
||||
cc := make([]string, ccCount)
|
||||
for i, address := range msg.Cc {
|
||||
cc[i] = address.String()
|
||||
}
|
||||
m.SetHeader("Cc", cc...)
|
||||
}
|
||||
|
||||
// BCC
|
||||
bccCount := len(msg.Bcc)
|
||||
if bccCount > 0 {
|
||||
bcc := make([]string, bccCount)
|
||||
for i, address := range msg.Bcc {
|
||||
bcc[i] = address.String()
|
||||
}
|
||||
m.SetHeader("Bcc", bcc...)
|
||||
}
|
||||
|
||||
m.SetBody("text/html", msg.HtmlBody)
|
||||
|
||||
slog.Info("dialing...", slog.String("host", t.Host), slog.Int("port", t.Port))
|
||||
d := gomail.NewDialer(t.Host, t.Port, t.Username, t.Password)
|
||||
if err := d.DialAndSend(m); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
slog.Info("sent email %s" + msg.Subject)
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user