Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions app/pkg/env/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,12 @@ type config struct {
Region string `env:"EMAIL_MAILGUN_REGION,default=US"` // possible values: US or EU
}
SMTP struct {
Host string `env:"EMAIL_SMTP_HOST"`
Port string `env:"EMAIL_SMTP_PORT"`
Username string `env:"EMAIL_SMTP_USERNAME"`
Password string `env:"EMAIL_SMTP_PASSWORD"`
EnableStartTLS bool `env:"EMAIL_SMTP_ENABLE_STARTTLS,default=true"`
Host string `env:"EMAIL_SMTP_HOST"`
Port string `env:"EMAIL_SMTP_PORT"`
Username string `env:"EMAIL_SMTP_USERNAME"`
Password string `env:"EMAIL_SMTP_PASSWORD"`
EnableStartTLS bool `env:"EMAIL_SMTP_ENABLE_STARTTLS,default=true"`
EnableImplicitTLS bool `env:"EMAIL_SMTP_ENABLE_IMPLICIT_TLS,default=false"`
}
}
BlobStorage struct {
Expand Down
29 changes: 23 additions & 6 deletions app/services/email/smtp/smtp.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,25 +100,42 @@ func sendMail(ctx context.Context, c *cmd.SendMail) {
smtpConfig := env.Config.Email.SMTP
servername := fmt.Sprintf("%s:%s", smtpConfig.Host, smtpConfig.Port)
auth := authenticate(smtpConfig.Username, smtpConfig.Password, smtpConfig.Host)
err = Send(localname, servername, smtpConfig.EnableStartTLS, auth, email.NoReply, []string{to.Address}, b.Bytes())
err = Send(localname, servername, smtpConfig.EnableStartTLS, smtpConfig.EnableImplicitTLS, auth, email.NoReply, []string{to.Address}, b.Bytes())
if err != nil {
panic(errors.Wrap(err, "failed to send email with template %s", c.TemplateName))
}
log.Debug(ctx, "Email sent.")
}
}

var Send = func(localName, serverAddress string, enableStartTLS bool, a gosmtp.Auth, from string, to []string, msg []byte) error {
var Send = func(localName, serverAddress string, enableStartTLS, enableImplicitTLS bool, a gosmtp.Auth, from string, to []string, msg []byte) error {
host, _, _ := net.SplitHostPort(serverAddress)
c, err := gosmtp.Dial(serverAddress)
if err != nil {
return err

var c *gosmtp.Client
var err error

if enableImplicitTLS {
// Implicit TLS (SMTPS): wrap connection in TLS before any SMTP command.
// Typically used on port 465.
conn, err := tls.Dial("tcp", serverAddress, &tls.Config{ServerName: host})
if err != nil {
return err
}
c, err = gosmtp.NewClient(conn, host)
if err != nil {
return err
}
} else {
c, err = gosmtp.Dial(serverAddress)
if err != nil {
return err
}
}
defer func() { _ = c.Close() }()
if err = c.Hello(localName); err != nil {
return err
}
if enableStartTLS {
if enableStartTLS && !enableImplicitTLS {
if ok, _ := c.Extension("STARTTLS"); ok {
config := &tls.Config{ServerName: host}
if err = c.StartTLS(config); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion app/services/email/smtp/smtp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ var ctx context.Context

var requests = make([]request, 0)

func mockSend(localname, servername string, enableStartTLS bool, auth gosmtp.Auth, from string, to []string, body []byte) error {
func mockSend(localname, servername string, enableStartTLS, enableImplicitTLS bool, auth gosmtp.Auth, from string, to []string, body []byte) error {
requests = append(requests, request{servername, auth, from, to, body})
return nil
}
Expand Down