76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
|
package mailinglist
|
||
|
|
||
|
import (
|
||
|
"github.com/emersion/go-sasl"
|
||
|
"github.com/emersion/go-smtp"
|
||
|
)
|
||
|
|
||
|
// Mailer is used to deliver emails to arbitrary recipients.
|
||
|
type Mailer interface {
|
||
|
Send(to, subject, body string) error
|
||
|
}
|
||
|
|
||
|
// MailerParams are used to initialize a new Mailer instance
|
||
|
type MailerParams struct {
|
||
|
SMTPAddr string
|
||
|
|
||
|
// Optional, if not given then no auth is attempted.
|
||
|
SMTPAuth sasl.Client
|
||
|
|
||
|
// The sending email address to use for all emails being sent.
|
||
|
SendAs string
|
||
|
}
|
||
|
|
||
|
type mailer struct {
|
||
|
params MailerParams
|
||
|
}
|
||
|
|
||
|
// NewMailer initializes and returns a Mailer which will use an external SMTP
|
||
|
// server to deliver email.
|
||
|
func NewMailer(params MailerParams) Mailer {
|
||
|
return &mailer{
|
||
|
params: params,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *mailer) Send(to, subject, body string) error {
|
||
|
|
||
|
msg := []byte("From: " + m.params.SendAs + "\r\n" +
|
||
|
"To: " + to + "\r\n" +
|
||
|
"Subject: " + subject + "\r\n\r\n" +
|
||
|
body + "\r\n")
|
||
|
|
||
|
c, err := smtp.Dial(m.params.SMTPAddr)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer c.Close()
|
||
|
|
||
|
if err = c.Auth(m.params.SMTPAuth); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if err = c.Mail(m.params.SendAs, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if err = c.Rcpt(to); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
w, err := c.Data()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if _, err = w.Write(msg); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if err = w.Close(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return c.Quit()
|
||
|
}
|