64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package mail
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"net"
|
|
|
|
"gopkg.in/mail.v2"
|
|
|
|
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
|
"github.com/mayswind/ezbookkeeping/pkg/settings"
|
|
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
|
)
|
|
|
|
// DefaultMailer represents default mailer
|
|
type DefaultMailer struct {
|
|
dialer *mail.Dialer
|
|
fromAddress string
|
|
}
|
|
|
|
// NewDefaultMailer returns a new default mailer
|
|
func NewDefaultMailer(smtpConfig *settings.SMTPConfig) (*DefaultMailer, error) {
|
|
host, portStr, err := net.SplitHostPort(smtpConfig.SMTPHost)
|
|
|
|
if err != nil {
|
|
return nil, errs.ErrSMTPServerHostInvalid
|
|
}
|
|
|
|
port, err := utils.StringToInt(portStr)
|
|
|
|
if err != nil {
|
|
return nil, errs.ErrSMTPServerHostInvalid
|
|
}
|
|
|
|
dialer := mail.NewDialer(host, port, smtpConfig.SMTPUser, smtpConfig.SMTPPasswd)
|
|
dialer.TLSConfig = &tls.Config{
|
|
ServerName: host,
|
|
InsecureSkipVerify: smtpConfig.SMTPSkipTLSVerify,
|
|
}
|
|
|
|
mailer := &DefaultMailer{
|
|
dialer: dialer,
|
|
fromAddress: smtpConfig.FromAddress,
|
|
}
|
|
|
|
return mailer, nil
|
|
}
|
|
|
|
// SendMail sends an email according to argument
|
|
func (m *DefaultMailer) SendMail(message *MailMessage) error {
|
|
if m.dialer == nil {
|
|
return errs.ErrSMTPServerNotEnabled
|
|
}
|
|
|
|
mailMessage := mail.NewMessage()
|
|
mailMessage.SetHeader("From", m.fromAddress)
|
|
mailMessage.SetHeader("To", message.To)
|
|
mailMessage.SetHeader("Subject", message.Subject)
|
|
mailMessage.SetBody("text/html", message.Body)
|
|
|
|
err := m.dialer.DialAndSend(mailMessage)
|
|
|
|
return err
|
|
}
|