Fix SMTP submission HELO handling
This commit is contained in:
@@ -21,6 +21,7 @@ Recommended settings:
|
|||||||
- `ALMA_PASSWORD`
|
- `ALMA_PASSWORD`
|
||||||
- `SMTP_PORT=587`
|
- `SMTP_PORT=587`
|
||||||
- `SMTP_STARTTLS=true`
|
- `SMTP_STARTTLS=true`
|
||||||
|
- `SMTP_HELO_NAME=mailer.example.invalid`
|
||||||
- `SMTP_USERNAME`
|
- `SMTP_USERNAME`
|
||||||
- `SMTP_PASSWORD`
|
- `SMTP_PASSWORD`
|
||||||
- `PRINT_REPORT=true`
|
- `PRINT_REPORT=true`
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ type Config struct {
|
|||||||
SMTPUsername string
|
SMTPUsername string
|
||||||
SMTPPassword string
|
SMTPPassword string
|
||||||
SMTPStartTLS bool
|
SMTPStartTLS bool
|
||||||
|
SMTPHeloName string
|
||||||
EmailFrom string
|
EmailFrom string
|
||||||
EmailTo []string
|
EmailTo []string
|
||||||
PrintReport bool
|
PrintReport bool
|
||||||
@@ -172,6 +173,10 @@ func loadConfig() (Config, error) {
|
|||||||
return Config{}, err
|
return Config{}, err
|
||||||
}
|
}
|
||||||
smtpStartTLS := readBool("SMTP_STARTTLS", true)
|
smtpStartTLS := readBool("SMTP_STARTTLS", true)
|
||||||
|
smtpHeloName, err := readValue("SMTP_HELO_NAME", "", false)
|
||||||
|
if err != nil {
|
||||||
|
return Config{}, err
|
||||||
|
}
|
||||||
emailFrom, err := readValue("EMAIL_FROM", "", false)
|
emailFrom, err := readValue("EMAIL_FROM", "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Config{}, err
|
return Config{}, err
|
||||||
@@ -204,6 +209,7 @@ func loadConfig() (Config, error) {
|
|||||||
SMTPUsername: smtpUsername,
|
SMTPUsername: smtpUsername,
|
||||||
SMTPPassword: smtpPassword,
|
SMTPPassword: smtpPassword,
|
||||||
SMTPStartTLS: smtpStartTLS,
|
SMTPStartTLS: smtpStartTLS,
|
||||||
|
SMTPHeloName: normalizeSMTPHeloName(smtpHeloName),
|
||||||
EmailFrom: emailFrom,
|
EmailFrom: emailFrom,
|
||||||
EmailTo: emailTo,
|
EmailTo: emailTo,
|
||||||
PrintReport: printReport,
|
PrintReport: printReport,
|
||||||
@@ -594,11 +600,18 @@ func sendEmail(cfg Config, subject, body string) error {
|
|||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
host := cfg.SMTPHost
|
host := cfg.SMTPHost
|
||||||
|
heloName := normalizeSMTPHeloName(cfg.SMTPHeloName)
|
||||||
|
if err := conn.Hello(heloName); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if cfg.SMTPStartTLS {
|
if cfg.SMTPStartTLS {
|
||||||
if ok, _ := conn.Extension("STARTTLS"); ok {
|
if ok, _ := conn.Extension("STARTTLS"); ok {
|
||||||
if err := conn.StartTLS(&tls.Config{ServerName: host, MinVersion: tls.VersionTLS12}); err != nil {
|
if err := conn.StartTLS(&tls.Config{ServerName: host, MinVersion: tls.VersionTLS12}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := conn.Hello(heloName); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if cfg.SMTPUsername != "" {
|
if cfg.SMTPUsername != "" {
|
||||||
@@ -641,6 +654,23 @@ func sendEmail(cfg Config, subject, body string) error {
|
|||||||
return conn.Quit()
|
return conn.Quit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func normalizeSMTPHeloName(value string) string {
|
||||||
|
value = strings.TrimSpace(value)
|
||||||
|
if value == "" {
|
||||||
|
hostname, err := os.Hostname()
|
||||||
|
if err == nil {
|
||||||
|
value = strings.TrimSpace(hostname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if value == "" {
|
||||||
|
return "localhost.localdomain"
|
||||||
|
}
|
||||||
|
if strings.Contains(value, ".") {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
return value + ".localdomain"
|
||||||
|
}
|
||||||
|
|
||||||
func inferAssignmentDate(monthDay string, now time.Time) time.Time {
|
func inferAssignmentDate(monthDay string, now time.Time) time.Time {
|
||||||
return inferDate(monthDay, now, false)
|
return inferDate(monthDay, now, false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,6 +132,15 @@ func TestLoadAlmaCredsFromFile(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNormalizeSMTPHeloName(t *testing.T) {
|
||||||
|
if got := normalizeSMTPHeloName("mail.example.invalid"); got != "mail.example.invalid" {
|
||||||
|
t.Fatalf("got %q", got)
|
||||||
|
}
|
||||||
|
if got := normalizeSMTPHeloName("mailer"); got != "mailer.localdomain" {
|
||||||
|
t.Fatalf("got %q", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func mustParseHTML(text string) *html.Node {
|
func mustParseHTML(text string) *html.Node {
|
||||||
doc, err := html.Parse(strings.NewReader(text))
|
doc, err := html.Parse(strings.NewReader(text))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user