(Feat): Initial Commit
This commit is contained in:
56
internal/mailer/transport/smtp.go
Normal file
56
internal/mailer/transport/smtp.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package transport
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/smtp"
|
||||
"strconv"
|
||||
|
||||
"github.com/jordan-wright/email"
|
||||
)
|
||||
|
||||
type SMTPMailTransport struct {
|
||||
config SMTPMailTransportConfig
|
||||
addr string
|
||||
auth smtp.Auth
|
||||
}
|
||||
|
||||
func NewSMTP(config SMTPMailTransportConfig) *SMTPMailTransport {
|
||||
mailTransport := &SMTPMailTransport{
|
||||
config: config,
|
||||
addr: net.JoinHostPort(config.Host, strconv.Itoa(config.Port)),
|
||||
auth: nil,
|
||||
}
|
||||
|
||||
switch config.AuthType {
|
||||
case SMTPAuthTypePlain:
|
||||
mailTransport.auth = smtp.PlainAuth("", config.Username, config.Password, config.Host)
|
||||
case SMTPAuthTypeCRAMMD5:
|
||||
mailTransport.auth = smtp.CRAMMD5Auth(config.Username, config.Password)
|
||||
case SMTPAuthTypeLogin:
|
||||
mailTransport.auth = LoginAuth(config.Username, config.Password, config.Host)
|
||||
}
|
||||
|
||||
return mailTransport
|
||||
}
|
||||
|
||||
func (m *SMTPMailTransport) Send(mail *email.Email) error {
|
||||
var err error
|
||||
|
||||
switch m.config.Encryption {
|
||||
case SMTPEncryptionNone:
|
||||
err = mail.Send(m.addr, m.auth)
|
||||
case SMTPEncryptionTLS:
|
||||
err = mail.SendWithTLS(m.addr, m.auth, m.config.TLSConfig)
|
||||
case SMTPEncryptionStartTLS:
|
||||
err = mail.SendWithStartTLS(m.addr, m.auth, m.config.TLSConfig)
|
||||
default:
|
||||
return fmt.Errorf("invalid SMTP encryption %q", m.config.Encryption)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to send email: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user