// Package report sends a deployment summary email via SMTP. package report import ( "fmt" "net/smtp" "os" "strings" "time" ) // SMTP2Go relay configuration for X9.cz deployment reports. const ( smtpHost = "mail-eu.smtp2go.com" smtpPort = "2525" smtpUser = "xetup" smtpPass = "M9ahxHOnJ8fM0CEF" mailFrom = "xetup@x9.cz" mailTo = "net@x9.cz" ) // StepResult holds one row of the deployment report. type StepResult struct { Num string Name string Status string // OK, ERROR, SKIPPED, CANCELLED Elapsed time.Duration } // Send emails the deployment report. Non-fatal: returns error but caller // should log it and continue (deployment is already done). func Send(results []StepResult) error { hostname, _ := os.Hostname() now := time.Now().Format("2006-01-02 15:04") subject := fmt.Sprintf("xetup report %s", hostname) body := buildHTML(results, hostname, now) msg := strings.Join([]string{ "From: " + mailFrom, "To: " + mailTo, "Subject: " + subject, "MIME-Version: 1.0", "Content-Type: text/html; charset=UTF-8", "", body, }, "\r\n") auth := smtp.PlainAuth("", smtpUser, smtpPass, smtpHost) return smtp.SendMail( smtpHost+":"+smtpPort, auth, mailFrom, []string{mailTo}, []byte(msg), ) } func buildHTML(results []StepResult, hostname, dateTime string) string { var ok, errs, skipped int var rows strings.Builder for _, r := range results { color := "#333" icon := "" switch r.Status { case "OK": ok++ color = "#2e7d32" icon = "✓" case "ERROR": errs++ color = "#c62828" icon = "✗" default: skipped++ color = "#9e9e9e" icon = "–" } elapsed := "" if r.Elapsed > 0 { elapsed = r.Elapsed.Round(time.Second).String() } fmt.Fprintf(&rows, `%s`+ `%s`+ `%s`+ `%s`+ `%s`, color, icon, r.Num, r.Name, color, r.Status, elapsed) } summaryColor := "#2e7d32" summaryText := "Deployment OK" if errs > 0 { summaryColor = "#c62828" summaryText = fmt.Sprintf("Deployment finished with %d error(s)", errs) } return fmt.Sprintf(`

xetup report

%s — %s

%s
Krok Nazev Status Cas
%s — OK: %d   CHYBY: %d   PRESKOCENO: %d

Odeslano z xetup.exe — log: C:\Windows\Setup\Scripts\Deploy.log

`, hostname, dateTime, rows.String(), summaryColor, summaryText, ok, errs, skipped) }