78 lines
1.3 KiB
Go
78 lines
1.3 KiB
Go
|
// Copyright (C) 2019 Storj Labs, Inc.
|
||
|
// See LICENSE for copying information
|
||
|
|
||
|
package mail
|
||
|
|
||
|
import (
|
||
|
"crypto/tls"
|
||
|
"net"
|
||
|
"net/mail"
|
||
|
"net/smtp"
|
||
|
|
||
|
"github.com/zeebo/errs"
|
||
|
)
|
||
|
|
||
|
// SMTPSender is smtp sender
|
||
|
type SMTPSender struct {
|
||
|
ServerAddress string
|
||
|
|
||
|
From mail.Address
|
||
|
Auth smtp.Auth
|
||
|
}
|
||
|
|
||
|
// SendEmail sends email message to the given recipient
|
||
|
func (sender *SMTPSender) SendEmail(msg *Message) error {
|
||
|
host, _, err := net.SplitHostPort(sender.ServerAddress)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
client, err := smtp.Dial(sender.ServerAddress)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
// close underlying connection
|
||
|
defer func() {
|
||
|
err = errs.Combine(err, client.Close())
|
||
|
}()
|
||
|
|
||
|
// send smtp hello or ehlo msg and establish connection over tls
|
||
|
err = client.StartTLS(&tls.Config{ServerName: host})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = client.Auth(sender.Auth)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = client.Mail(sender.From.Address)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// add recipients
|
||
|
for _, to := range msg.To {
|
||
|
err = client.Rcpt(to.Address)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
data, err := client.Data()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer func() {
|
||
|
err = errs.Combine(err, data.Close())
|
||
|
}()
|
||
|
|
||
|
_, err = data.Write(msg.Bytes())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return client.Quit()
|
||
|
}
|