Add support to SSL/TLS/SSLTLS encryption for SMTP (#221)
This commit is contained in:
		
							parent
							
								
									2c2db61158
								
							
						
					
					
						commit
						63d6e1f391
					
				|  | @ -3,9 +3,9 @@ package emailer | |||
| import ( | ||||
| 	"crypto/tls" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| 
 | ||||
| 	mail "github.com/xhit/go-simple-mail/v2" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| type SmtpMail struct { | ||||
|  | @ -14,6 +14,7 @@ type SmtpMail struct { | |||
| 	username   string | ||||
| 	password   string | ||||
| 	authType   mail.AuthType | ||||
| 	encryption mail.Encryption | ||||
| 	noTLSCheck bool | ||||
| 	fromName   string | ||||
| 	from       string | ||||
|  | @ -30,8 +31,21 @@ func authType(authType string) mail.AuthType { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func NewSmtpMail(hostname string, port int, username string, password string, noTLSCheck bool, auth string, fromName, from string) *SmtpMail { | ||||
| 	ans := SmtpMail{hostname: hostname, port: port, username: username, password: password, noTLSCheck: noTLSCheck, fromName: fromName, from: from, authType: authType(auth)} | ||||
| func encryptionType(encryptionType string) mail.Encryption { | ||||
| 	switch strings.ToUpper(encryptionType) { | ||||
| 	case "SSL": | ||||
| 		return mail.EncryptionSSL | ||||
| 	case "SSLTLS": | ||||
| 		return mail.EncryptionSSLTLS | ||||
| 	case "TLS": | ||||
| 		return mail.EncryptionTLS | ||||
| 	default: | ||||
| 		return mail.EncryptionSTARTTLS | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func NewSmtpMail(hostname string, port int, username string, password string, noTLSCheck bool, auth string, fromName, from string, encryption string) *SmtpMail { | ||||
| 	ans := SmtpMail{hostname: hostname, port: port, username: username, password: password, noTLSCheck: noTLSCheck, fromName: fromName, from: from, authType: authType(auth), encryption: encryptionType(encryption)} | ||||
| 	return &ans | ||||
| } | ||||
| 
 | ||||
|  | @ -50,7 +64,7 @@ func (o *SmtpMail) Send(toName string, to string, subject string, content string | |||
| 	server.Authentication = o.authType | ||||
| 	server.Username = o.username | ||||
| 	server.Password = o.password | ||||
| 	server.Encryption = mail.EncryptionSTARTTLS | ||||
| 	server.Encryption = o.encryption | ||||
| 	server.KeepAlive = false | ||||
| 	server.ConnectTimeout = 10 * time.Second | ||||
| 	server.SendTimeout = 10 * time.Second | ||||
|  |  | |||
							
								
								
									
										7
									
								
								main.go
								
								
								
								
							
							
						
						
									
										7
									
								
								main.go
								
								
								
								
							|  | @ -33,6 +33,7 @@ var ( | |||
| 	flagSmtpPassword   string | ||||
| 	flagSmtpAuthType   string = "None" | ||||
| 	flagSmtpNoTLSCheck bool   = false | ||||
| 	flagSmtpEncryption string = "STARTTLS" | ||||
| 	flagSendgridApiKey string | ||||
| 	flagEmailFrom      string | ||||
| 	flagEmailFromName  string = "WireGuard UI" | ||||
|  | @ -60,7 +61,8 @@ func init() { | |||
| 	flag.StringVar(&flagSmtpUsername, "smtp-username", util.LookupEnvOrString("SMTP_USERNAME", flagSmtpUsername), "SMTP Username") | ||||
| 	flag.StringVar(&flagSmtpPassword, "smtp-password", util.LookupEnvOrString("SMTP_PASSWORD", flagSmtpPassword), "SMTP Password") | ||||
| 	flag.BoolVar(&flagSmtpNoTLSCheck, "smtp-no-tls-check", util.LookupEnvOrBool("SMTP_NO_TLS_CHECK", flagSmtpNoTLSCheck), "Disable TLS verification for SMTP. This is potentially dangerous.") | ||||
| 	flag.StringVar(&flagSmtpAuthType, "smtp-auth-type", util.LookupEnvOrString("SMTP_AUTH_TYPE", flagSmtpAuthType), "SMTP Auth Type : Plain or None.") | ||||
| 	flag.StringVar(&flagSmtpEncryption, "smtp-encryption", util.LookupEnvOrString("SMTP_ENCRYPTION", flagSmtpEncryption), "SMTP Encryption : SSL, SSLTLS, TLS or STARTTLS (by default)") | ||||
| 	flag.StringVar(&flagSmtpAuthType, "smtp-auth-type", util.LookupEnvOrString("SMTP_AUTH_TYPE", flagSmtpAuthType), "SMTP Auth Type : Plain, Login or None.") | ||||
| 	flag.StringVar(&flagSendgridApiKey, "sendgrid-api-key", util.LookupEnvOrString("SENDGRID_API_KEY", flagSendgridApiKey), "Your sendgrid api key.") | ||||
| 	flag.StringVar(&flagEmailFrom, "email-from", util.LookupEnvOrString("EMAIL_FROM_ADDRESS", flagEmailFrom), "'From' email address.") | ||||
| 	flag.StringVar(&flagEmailFromName, "email-from-name", util.LookupEnvOrString("EMAIL_FROM_NAME", flagEmailFromName), "'From' email name.") | ||||
|  | @ -78,6 +80,7 @@ func init() { | |||
| 	util.SmtpPassword = flagSmtpPassword | ||||
| 	util.SmtpAuthType = flagSmtpAuthType | ||||
| 	util.SmtpNoTLSCheck = flagSmtpNoTLSCheck | ||||
| 	util.SmtpEncryption = flagSmtpEncryption | ||||
| 	util.SendgridApiKey = flagSendgridApiKey | ||||
| 	util.EmailFrom = flagEmailFrom | ||||
| 	util.EmailFromName = flagEmailFromName | ||||
|  | @ -138,7 +141,7 @@ func main() { | |||
| 	if util.SendgridApiKey != "" { | ||||
| 		sendmail = emailer.NewSendgridApiMail(util.SendgridApiKey, util.EmailFromName, util.EmailFrom) | ||||
| 	} else { | ||||
| 		sendmail = emailer.NewSmtpMail(util.SmtpHostname, util.SmtpPort, util.SmtpUsername, util.SmtpPassword, util.SmtpNoTLSCheck, util.SmtpAuthType, util.EmailFromName, util.EmailFrom) | ||||
| 		sendmail = emailer.NewSmtpMail(util.SmtpHostname, util.SmtpPort, util.SmtpUsername, util.SmtpPassword, util.SmtpNoTLSCheck, util.SmtpAuthType, util.EmailFromName, util.EmailFrom, util.SmtpEncryption) | ||||
| 	} | ||||
| 
 | ||||
| 	app.GET(util.BasePath+"/_health", handler.Health()) | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ var ( | |||
| 	SmtpUsername   string | ||||
| 	SmtpPassword   string | ||||
| 	SmtpNoTLSCheck bool | ||||
| 	SmtpEncryption string | ||||
| 	SmtpAuthType   string | ||||
| 	SendgridApiKey string | ||||
| 	EmailFrom      string | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue