@ -18,32 +18,33 @@ import (
// Mailer represents mail service.
type Mailer struct {
// Mailer
Name string
From string
EnvelopeFrom string
Name string ` ini:"NAME" `
From string ` ini:"FROM" `
EnvelopeFrom string ` ini:"ENVELOPE_FROM" `
OverrideEnvelopeFrom bool ` ini:"-" `
FromName string
FromEmail string
SendAsPlainText bool
SubjectPrefix string
FromName string ` ini:"-" `
FromEmail string ` ini:"-" `
SendAsPlainText bool ` ini:"SEND_AS_PLAIN_TEXT" `
SubjectPrefix string ` ini:"SUBJECT_PREFIX" `
// SMTP sender
Protocol string
SMTPAddr string
SMTPPort string
User , Passwd string
EnableHelo bool
HeloHostname string
ForceTrustServerCert bool
UseClientCert bool
ClientCertFile string
ClientKeyFile string
Protocol string ` ini:"PROTOCOL" `
SMTPAddr string ` ini:"SMTP_ADDR" `
SMTPPort string ` ini:"SMTP_PORT" `
User string ` ini:"USER" `
Passwd string ` ini:"PASSWD" `
EnableHelo bool ` ini:"ENABLE_HELO" `
HeloHostname string ` ini:"HELO_HOSTNAME" `
ForceTrustServerCert bool ` ini:"FORCE_TRUST_SERVER_CERT" `
UseClientCert bool ` ini:"USE_CLIENT_CERT" `
ClientCertFile string ` ini:"CLIENT_CERT_FILE" `
ClientKeyFile string ` ini:"CLIENT_KEY_FILE" `
// Sendmail sender
SendmailPath string
SendmailArgs [ ] string
SendmailTimeout time . Duration
SendmailConvertCRLF bool
SendmailPath string ` ini:"SENDMAIL_PATH" `
SendmailArgs [ ] string ` ini:"-" `
SendmailTimeout time . Duration ` ini:"SENDMAIL_TIMEOUT" `
SendmailConvertCRLF bool ` ini:"SENDMAIL_CONVERT_CRLF" `
}
// MailService the global mailer
@ -56,35 +57,12 @@ func newMailService() {
return
}
MailService = & Mailer {
Name : sec . Key ( "NAME" ) . MustString ( AppName ) ,
SendAsPlainText : sec . Key ( "SEND_AS_PLAIN_TEXT" ) . MustBool ( false ) ,
Protocol : sec . Key ( "PROTOCOL" ) . In ( "" , [ ] string { "smtp" , "smtps" , "smtp+startls" , "smtp+unix" , "sendmail" , "dummy" } ) ,
SMTPAddr : sec . Key ( "SMTP_ADDR" ) . String ( ) ,
SMTPPort : sec . Key ( "SMTP_PORT" ) . String ( ) ,
User : sec . Key ( "USER" ) . String ( ) ,
Passwd : sec . Key ( "PASSWD" ) . String ( ) ,
EnableHelo : sec . Key ( "ENABLE_HELO" ) . MustBool ( true ) ,
HeloHostname : sec . Key ( "HELO_HOSTNAME" ) . String ( ) ,
ForceTrustServerCert : sec . Key ( "FORCE_TRUST_SERVER_CERT" ) . MustBool ( false ) ,
UseClientCert : sec . Key ( "USE_CLIENT_CERT" ) . MustBool ( false ) ,
ClientCertFile : sec . Key ( "CLIENT_CERT_FILE" ) . String ( ) ,
ClientKeyFile : sec . Key ( "CLIENT_KEY_FILE" ) . String ( ) ,
SubjectPrefix : sec . Key ( "SUBJECT_PREFIX" ) . MustString ( "" ) ,
SendmailPath : sec . Key ( "SENDMAIL_PATH" ) . MustString ( "sendmail" ) ,
SendmailTimeout : sec . Key ( "SENDMAIL_TIMEOUT" ) . MustDuration ( 5 * time . Minute ) ,
SendmailConvertCRLF : sec . Key ( "SENDMAIL_CONVERT_CRLF" ) . MustBool ( true ) ,
}
MailService . From = sec . Key ( "FROM" ) . MustString ( MailService . User )
MailService . EnvelopeFrom = sec . Key ( "ENVELOPE_FROM" ) . MustString ( "" )
// Handle Deprecations and map on to new configuration
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "MAILER_TYPE" , "mailer" , "PROTOCOL" )
if sec . HasKey ( "MAILER_TYPE" ) && ! sec . HasKey ( "PROTOCOL" ) {
if sec . Key ( "MAILER_TYPE" ) . String ( ) == "sendmail" {
MailService . Protocol = "sendmail"
sec . Key ( "PROTOCOL" ) . MustString ( "sendmail" )
}
}
@ -96,31 +74,91 @@ func newMailService() {
if err != nil {
log . Fatal ( "Invalid mailer.HOST (%s): %v" , givenHost , err )
}
MailService . SMTPAddr = addr
MailService . SMTPPort = port
sec . Key ( "SMTP_ADDR" ) . MustString ( addr )
sec . Key ( "SMTP_PORT" ) . MustString ( port )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "IS_TLS_ENABLED" , "mailer" , "PROTOCOL" )
if sec . HasKey ( "IS_TLS_ENABLED" ) && ! sec . HasKey ( "PROTOCOL" ) {
if sec . Key ( "IS_TLS_ENABLED" ) . MustBool ( ) {
MailService . Protocol = "smtps"
sec . Key ( "PROTOCOL" ) . MustString ( "smtps" )
} else {
MailService . Protocol = "smtp+startls"
sec . Key ( "PROTOCOL" ) . MustString ( "smtp+starttls" )
}
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "DISABLE_HELO" , "mailer" , "ENABLE_HELO" )
if sec . HasKey ( "DISABLE_HELO" ) && ! sec . HasKey ( "ENABLE_HELO" ) {
sec . Key ( "ENABLE_HELO" ) . MustBool ( ! sec . Key ( "DISABLE_HELO" ) . MustBool ( ) )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "SKIP_VERIFY" , "mailer" , "FORCE_TRUST_SERVER_CERT" )
if sec . HasKey ( "SKIP_VERIFY" ) && ! sec . HasKey ( "FORCE_TRUST_SERVER_CERT" ) {
sec . Key ( "FORCE_TRUST_SERVER_CERT" ) . MustBool ( sec . Key ( "SKIP_VERIFY" ) . MustBool ( ) )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "USE_CERTIFICATE" , "mailer" , "USE_CLIENT_CERT" )
if sec . HasKey ( "USE_CERTIFICATE" ) && ! sec . HasKey ( "USE_CLIENT_CERT" ) {
sec . Key ( "USE_CLIENT_CERT" ) . MustBool ( sec . Key ( "USE_CERTIFICATE" ) . MustBool ( ) )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "CERT_FILE" , "mailer" , "CLIENT_CERT_FILE" )
if sec . HasKey ( "CERT_FILE" ) && ! sec . HasKey ( "CLIENT_CERT_FILE" ) {
sec . Key ( "CERT_FILE" ) . MustString ( sec . Key ( "CERT_FILE" ) . String ( ) )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "KEY_FILE" , "mailer" , "CLIENT_KEY_FILE" )
if sec . HasKey ( "KEY_FILE" ) && ! sec . HasKey ( "CLIENT_KEY_FILE" ) {
sec . Key ( "KEY_FILE" ) . MustString ( sec . Key ( "KEY_FILE" ) . String ( ) )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "ENABLE_HTML_ALTERNATIVE" , "mailer" , "SEND_AS_PLAIN_TEXT" )
if sec . HasKey ( "ENABLE_HTML_ALTERNATIVE" ) && ! sec . HasKey ( "SEND_AS_PLAIN_TEXT" ) {
sec . Key ( "SEND_AS_PLAIN_TEXT" ) . MustBool ( ! sec . Key ( "ENABLE_HTML_ALTERNATIVE" ) . MustBool ( false ) )
}
if sec . HasKey ( "PROTOCOL" ) && sec . Key ( "PROTOCOL" ) . String ( ) == "smtp+startls" {
log . Error ( "Deprecated fallback `[mailer]` `PROTOCOL = smtp+startls` present. Use `[mailer]` `PROTOCOL = smtp+starttls`` instead. This fallback will be removed in v1.19.0" )
sec . Key ( "PROTOCOL" ) . SetValue ( "smtp+starttls" )
}
// Set default values & validate
sec . Key ( "NAME" ) . MustString ( AppName )
sec . Key ( "PROTOCOL" ) . In ( "" , [ ] string { "smtp" , "smtps" , "smtp+starttls" , "smtp+unix" , "sendmail" , "dummy" } )
sec . Key ( "ENABLE_HELO" ) . MustBool ( true )
sec . Key ( "FORCE_TRUST_SERVER_CERT" ) . MustBool ( false )
sec . Key ( "USE_CLIENT_CERT" ) . MustBool ( false )
sec . Key ( "SENDMAIL_PATH" ) . MustString ( "sendmail" )
sec . Key ( "SENDMAIL_TIMEOUT" ) . MustDuration ( 5 * time . Minute )
sec . Key ( "SENDMAIL_CONVERT_CRLF" ) . MustBool ( true )
sec . Key ( "FROM" ) . MustString ( sec . Key ( "USER" ) . String ( ) )
// Now map the values on to the MailService
MailService = & Mailer { }
if err := sec . MapTo ( MailService ) ; err != nil {
log . Fatal ( "Unable to map [mailer] section on to MailService. Error: %v" , err )
}
// Infer SMTPPort if not set
if MailService . SMTPPort == "" {
switch MailService . Protocol {
case "smtp" :
MailService . SMTPPort = "25"
case "smtps" :
MailService . SMTPPort = "465"
case "smtp+startls" :
case "smtp+startt ls" :
MailService . SMTPPort = "587"
}
}
// Infer Protocol
if MailService . Protocol == "" {
if strings . ContainsAny ( MailService . SMTPAddr , "/\\" ) {
MailService . Protocol = "smtp+unix"
@ -131,7 +169,7 @@ func newMailService() {
case "465" :
MailService . Protocol = "smtps"
case "587" :
MailService . Protocol = "smtp+startls"
MailService . Protocol = "smtp+startt ls"
default :
log . Error ( "unable to infer unspecified mailer.PROTOCOL from mailer.SMTP_PORT = %q, assume using smtps" , MailService . SMTPPort )
MailService . Protocol = "smtps"
@ -151,42 +189,6 @@ func newMailService() {
}
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "DISABLE_HELO" , "mailer" , "ENABLE_HELO" )
if sec . HasKey ( "DISABLE_HELO" ) && ! sec . HasKey ( "ENABLE_HELO" ) {
MailService . EnableHelo = ! sec . Key ( "DISABLE_HELO" ) . MustBool ( )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "SKIP_VERIFY" , "mailer" , "FORCE_TRUST_SERVER_CERT" )
if sec . HasKey ( "SKIP_VERIFY" ) && ! sec . HasKey ( "FORCE_TRUST_SERVER_CERT" ) {
MailService . ForceTrustServerCert = sec . Key ( "SKIP_VERIFY" ) . MustBool ( )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "USE_CERTIFICATE" , "mailer" , "USE_CLIENT_CERT" )
if sec . HasKey ( "USE_CERTIFICATE" ) && ! sec . HasKey ( "USE_CLIENT_CERT" ) {
MailService . UseClientCert = sec . Key ( "USE_CLIENT_CERT" ) . MustBool ( )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "CERT_FILE" , "mailer" , "CLIENT_CERT_FILE" )
if sec . HasKey ( "CERT_FILE" ) && ! sec . HasKey ( "CLIENT_CERT_FILE" ) {
MailService . ClientCertFile = sec . Key ( "CERT_FILE" ) . String ( )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "KEY_FILE" , "mailer" , "CLIENT_KEY_FILE" )
if sec . HasKey ( "KEY_FILE" ) && ! sec . HasKey ( "CLIENT_KEY_FILE" ) {
MailService . ClientKeyFile = sec . Key ( "KEY_FILE" ) . String ( )
}
// FIXME: DEPRECATED to be removed in v1.19.0
deprecatedSetting ( "mailer" , "ENABLE_HTML_ALTERNATIVE" , "mailer" , "SEND_AS_PLAIN_TEXT" )
if sec . HasKey ( "ENABLE_HTML_ALTERNATIVE" ) && ! sec . HasKey ( "SEND_AS_PLAIN_TEXT" ) {
MailService . SendAsPlainText = ! sec . Key ( "ENABLE_HTML_ALTERNATIVE" ) . MustBool ( false )
}
if MailService . From != "" {
parsed , err := mail . ParseAddress ( MailService . From )
if err != nil {