diff --git a/backend/00-router.go b/backend/00-router.go index 51995be..acb8512 100644 --- a/backend/00-router.go +++ b/backend/00-router.go @@ -61,6 +61,51 @@ func RegisterRoutes(mux *http.ServeMux) { mux.HandleFunc("/view/target/select", targetSelectHandler) mux.HandleFunc("/view/manual-copy", manualCopyHandler) mux.HandleFunc("/view/forward", forwardHandler) + mux.HandleFunc("/mail/send", mailSendHandler) +} + +func mailSendHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + if err := r.ParseForm(); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + to := splitRecipients(r.FormValue("to")) + subject := strings.TrimSpace(r.FormValue("subject")) + body := r.FormValue("body") + if len(to) == 0 { + http.Error(w, "Bitte mindestens einen Empfaenger eintragen.", http.StatusBadRequest) + return + } + if subject == "" { + subject = "(ohne Betreff)" + } + if err := SendPlainMail(to, subject, body); err != nil { + http.Error(w, err.Error(), http.StatusBadGateway) + return + } + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + fmt.Fprint(w, "gesendet") +} + +func splitRecipients(value string) []string { + fields := strings.FieldsFunc(value, func(r rune) bool { + return r == ',' || r == ';' || r == '\n' || r == '\r' || r == '\t' || r == ' ' + }) + recipients := make([]string, 0, len(fields)) + seen := make(map[string]bool, len(fields)) + for _, field := range fields { + addr := strings.TrimSpace(field) + if addr == "" || seen[strings.ToLower(addr)] { + continue + } + recipients = append(recipients, addr) + seen[strings.ToLower(addr)] = true + } + return recipients } func homeHandler(w http.ResponseWriter, r *http.Request) { @@ -73,8 +118,8 @@ func renderStartPage(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, `