diff --git a/backend/00-router.go b/backend/00-router.go index 13c0c42..4af265f 100644 --- a/backend/00-router.go +++ b/backend/00-router.go @@ -311,6 +311,7 @@ func emailBoxHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, renderEmailBoxSourcePane(accounts, selected.Name)) fmt.Fprintf(w, `
%s
`, renderInitialSourceMailboxList(selected)) + fmt.Fprintf(w, `
%s
`, renderInitialSourceMailboxRead(selected)) return } renderSourceEmailBoxPage(w, r, accounts, r.URL.Query().Get("source")) @@ -340,6 +341,7 @@ func sourceMailboxMessagesHandler(w http.ResponseWriter, r *http.Request) { return } renderSourceMailboxMessageList(w, account, folder, messages) + fmt.Fprintf(w, `
%s
`, renderSourceMailboxRead(account, folder, 0, messages)) } func sourceMailboxMessageHandler(w http.ResponseWriter, r *http.Request) { @@ -360,22 +362,8 @@ func sourceMailboxMessageHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - if index < 0 || index >= len(messages) { - http.Error(w, "message index out of range", http.StatusNotFound) - return - } - raw := messages[index].Body - msg, err := mail.ReadMessage(bytes.NewReader(raw)) - if err != nil { - renderReadPaneWithSource(w, account.Name, folder, "", index, "(unlesbar)", "", "", string(raw)) - return - } - renderReadPaneWithSource(w, account.Name, folder, "", index, - decodeHeader(msg.Header.Get("Subject")), - decodeHeader(msg.Header.Get("From")), - decodeHeader(msg.Header.Get("Date")), - messageBody(raw), - ) + w.Header().Set("Content-Type", "text/html; charset=utf-8") + fmt.Fprint(w, renderSourceMailboxRead(account, folder, index, messages)) } func archiveCreateHandler(w http.ResponseWriter, r *http.Request) { @@ -885,10 +873,10 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts [
%s
-
Nachricht waehlen.
+
%s
`, - renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxSourcePane(accounts, selectedAccount.Name), renderInitialSourceMailboxList(selectedAccount)) + renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxSourcePane(accounts, selectedAccount.Name), renderInitialSourceMailboxList(selectedAccount), renderInitialSourceMailboxRead(selectedAccount)) } func renderTargetEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts []Account) { @@ -992,11 +980,27 @@ func renderSourceFolders(b *strings.Builder, account Account) { return } for _, folder := range folders { - fmt.Fprintf(b, `%s%s`, - urlEsc(account.Name), urlEsc(folder.Name), html.EscapeString(folder.Name), html.EscapeString(strings.Join(folder.Attrs, " "))) + fmt.Fprintf(b, `%s%s`, + html.EscapeString(strings.Join(folder.Attrs, " ")), urlEsc(account.Name), urlEsc(folder.Name), html.EscapeString(folder.Name), html.EscapeString(sourceFolderRole(folder))) } } +func sourceFolderRole(folder Folder) string { + for _, attr := range folder.Attrs { + switch strings.ToLower(attr) { + case `\sent`: + return "Gesendet" + case `\drafts`: + return "Entwurf" + case `\trash`: + return "Papierkorb" + case `\junk`: + return "Spam" + } + } + return "" +} + func fetchSourceFolderMessages(account Account, folder string) ([]RawMessage, error) { if accountProto(account) == "pop3" { src, err := OpenPOP3Source(account) @@ -1031,6 +1035,21 @@ func renderInitialSourceMailboxList(account Account) string { return b.String() } +func renderInitialSourceMailboxRead(account Account) string { + if account.Name == "" { + return `
Nachricht waehlen.
` + } + folder, err := firstSourceFolder(account) + if err != nil { + return `
Nachricht waehlen.
` + } + messages, err := fetchSourceFolderMessages(account, folder) + if err != nil { + return `
Nachricht waehlen.
` + } + return renderSourceMailboxRead(account, folder, 0, messages) +} + func firstSourceFolder(account Account) (string, error) { if accountProto(account) == "pop3" { return "INBOX", nil @@ -1070,7 +1089,12 @@ func renderSourceMailboxMessageList(w io.Writer, account Account, folder string, } date = decodeHeader(msg.Header.Get("Date")) } - fmt.Fprintf(w, `%s%s%s`, + active := "" + if i == 0 { + active = " active" + } + fmt.Fprintf(w, `%s%s%s`, + active, html.EscapeString(account.Name), html.EscapeString(folder), i, urlEsc(account.Name), urlEsc(folder), i, html.EscapeString(from), html.EscapeString(subject), html.EscapeString(date)) @@ -1080,6 +1104,26 @@ func renderSourceMailboxMessageList(w io.Writer, account Account, folder string, } } +func renderSourceMailboxRead(account Account, folder string, index int, messages []RawMessage) string { + if index < 0 || index >= len(messages) { + return `
Nachricht waehlen.
` + } + raw := messages[index].Body + msg, err := mail.ReadMessage(bytes.NewReader(raw)) + var b strings.Builder + if err != nil { + renderReadPane(&b, "Quelle", account.Name, folder, "", index, "(unlesbar)", "", "", string(raw)) + return b.String() + } + renderReadPane(&b, "Quelle", account.Name, folder, "", index, + decodeHeader(msg.Header.Get("Subject")), + decodeHeader(msg.Header.Get("From")), + decodeHeader(msg.Header.Get("Date")), + messageBody(raw), + ) + return b.String() +} + func renderEmailBoxTargetPane(accounts []Account) string { var b strings.Builder b.WriteString(`
Ziel-Postfach