package main
import (
"log"
"strings"
"time"
errors "git.sequentialread.com/forest/pkg-errors"
mail "github.com/xhit/go-simple-mail"
)
type EmailService struct {
Host string
Port int
Username string
Password string
Encryption string
}
func ( emailService * EmailService ) Initialize ( ) error {
if emailService . Encryption == "" {
emailService . Encryption = "STARTTLS"
}
if emailService . Encryption != "STARTTLS" && emailService . Encryption != "SMTPS" {
return errors . New ( "EmailService.Encryption must be set to STARTTLS or SMTPS" )
}
return nil
}
func ( emailService * EmailService ) ValidateEmailAddress ( email string ) string {
if len ( email ) == 0 {
return "email is required"
} else if len ( email ) < 6 || strings . Count ( email , "@" ) != 1 || strings . Count ( email , "." ) < 1 || strings . LastIndex ( email , "." ) < strings . LastIndex ( email , "@" ) {
return "email must be a valid email address, like user@example.com"
}
return ""
}
func ( emailService * EmailService ) SendEmail ( subject , recipient , body string ) error {
recipientError := emailService . ValidateEmailAddress ( recipient )
if recipientError != "" {
return errors . New ( recipientError )
}
smtpClient := mail . NewSMTPClient ( )
smtpClient . Host = emailService . Host
smtpClient . Port = emailService . Port
smtpClient . Username = emailService . Username
smtpClient . Password = emailService . Password
if emailService . Encryption == "STARTTLS" {
smtpClient . Encryption = mail . EncryptionTLS
} else {
smtpClient . Encryption = mail . EncryptionSSL
}
smtpClient . KeepAlive = false
smtpClient . ConnectTimeout = 10 * time . Second
smtpClient . SendTimeout = 10 * time . Second
smtpConn , err := smtpClient . Connect ( )
if err != nil {
log . Printf ( "SendEmail(): could not connect to email server: %+v" , err )
return errors . New ( "could not connect to email server" )
}
email := mail . NewMSG ( )
email . SetFrom ( emailService . Username )
email . AddTo ( recipient )
email . SetSubject ( subject )
email . SetBody ( mail . TextPlain , body )
err = email . Send ( smtpConn )
if err != nil {
log . Printf ( "SendEmail(): connected to email server, but could not send mail: %+v" , err )
return errors . New ( "connected to email server, but could not send mail" )
}
return nil
}