Added smtp alerts

This commit is contained in:
Magnus Root 2026-03-27 17:36:52 +03:00
parent 3703b13d81
commit bc57f96b70

View file

@ -32,7 +32,7 @@ func emailSendHTML(subject, message string) error {
var auth smtp.Auth var auth smtp.Auth
if cfgEmailSMTPUser != "" && cfgEmailSMTPPassword != "" { if cfgEmailSMTPUser != "" && cfgEmailSMTPPassword != "" {
auth = smtp.PlainAuth("", cfgEmailSMTPUser, cfgEmailSMTPPassword, cfgEmailSMTPHost) auth = &emailLoginAuth{user: cfgEmailSMTPUser, password: cfgEmailSMTPPassword}
} }
header := strings.Join([]string{ header := strings.Join([]string{
@ -55,6 +55,34 @@ func emailSendHTML(subject, message string) error {
return nil return nil
} }
// ── LOGIN Auth ───────────────────────────────────────────────────────────────
// Реализация AUTH LOGIN для SMTP-серверов которые не поддерживают AUTH PLAIN.
// Стандартный smtp.PlainAuth использует механизм PLAIN — некоторые серверы
// (например Microsoft Exchange) принимают только LOGIN.
type emailLoginAuth struct {
user string
password string
}
func (a *emailLoginAuth) Start(_ *smtp.ServerInfo) (string, []byte, error) {
return "LOGIN", nil, nil
}
func (a *emailLoginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
if !more {
return nil, nil
}
switch strings.ToLower(strings.TrimSpace(string(fromServer))) {
case "username:":
return []byte(a.user), nil
case "password:":
return []byte(a.password), nil
default:
return nil, fmt.Errorf("неожиданный запрос от SMTP-сервера: %q", string(fromServer))
}
}
// emailBuildHTML оборачивает тело сообщения в HTML-шаблон письма. // emailBuildHTML оборачивает тело сообщения в HTML-шаблон письма.
// Telegram-теги уже являются валидным HTML, поэтому конвертация не нужна. // Telegram-теги уже являются валидным HTML, поэтому конвертация не нужна.
func emailBuildHTML(subject, body string) string { func emailBuildHTML(subject, body string) string {