add tab to render full html

This commit is contained in:
Matthieu Lamalle 2025-03-12 15:42:46 +01:00
parent 888ff2ec47
commit 213f92b163
4 changed files with 58 additions and 7 deletions

View File

@ -129,3 +129,11 @@ make release
## Licence
AGPL-3.0
### Envoyer un email de test
outil : swaks
```
swaks -t test@test.com -s localhost:2525 -f test@test.com -au fakesmtp -ap fakesmtp --add-header "Content-Type: text/html" --h-Subject "Sujet de message" --body "$(cat sample.txt)"
```

View File

@ -1,7 +1,7 @@
{{define "title"}}Email - FakeSMTP{{end}}
{{define "header_buttons"}}
<button class="button is-danger"
data-controller="restful"
data-controller="restful"
data-restful-endpoint="{{ .BaseURL }}/emails/{{ .Email.ID }}"
data-restful-method="DELETE"
data-restful-redirect="{{ .BaseURL }}/">
@ -35,16 +35,24 @@
<div data-controller="tabs">
<div class="tabs">
<ul>
<li data-action="click->tabs#openTab" data-target="tabs.tab" data-tabs-name="html" {{if .Email.HTML}}class="is-active"{{end}}><a>HTML</a></li>
<li data-action="click->tabs#openTab" data-target="tabs.tab" data-tabs-name="mail" {{if .Email.HTML}}class="is-active"{{end}}><a>Mail</a></li>
<li data-action="click->tabs#openTab" data-target="tabs.tab" data-tabs-name="html" ><a>HTML</a></li>
<li data-action="click->tabs#openTab" data-target="tabs.tab" data-tabs-name="text" {{if not .Email.HTML}}class="is-active"{{end}}><a>Text</a></li>
<li data-action="click->tabs#openTab" data-target="tabs.tab" data-tabs-name="headers"><a>Headers</a></li>
</ul>
</div>
<iframe data-target="tabs.tabContent" data-tabs-for="html"
<iframe data-target="tabs.tabContent" data-tabs-for="mail"
frameborder="0"
data-controller="iframe"
data-action="load->iframe#onLoad"
style="width:100%;{{if not .Email.HTML}}display:none;{{end}}"
style="width:100%;{{if not .Email.HTML}}display:none;{{end}}"
src="{{ .BaseURL }}/emails/{{ .Email.ID }}/mail">
</iframe>
<iframe data-target="tabs.tabContent" data-tabs-for="html"
frameborder="0"
data-controller="iframe"
data-action="load->iframe#onLoad"
style="width:100%;{{if not .Email.HTML}}display:none;{{end}}"
src="{{ .BaseURL }}/emails/{{ .Email.ID }}/html">
</iframe>
<div data-target="tabs.tabContent" data-tabs-for="text" style="{{if .Email.HTML}}display:none;{{end}}width:100%;overflow:hidden;">

View File

@ -5,13 +5,12 @@ import (
"net/http"
"strconv"
"github.com/microcosm-cc/bluemonday"
"forge.cadoles.com/Cadoles/fake-smtp/internal/command"
"forge.cadoles.com/Cadoles/fake-smtp/internal/model"
"forge.cadoles.com/Cadoles/fake-smtp/internal/query"
"forge.cadoles.com/Cadoles/fake-smtp/internal/storm"
"github.com/go-chi/chi/v5"
"github.com/microcosm-cc/bluemonday"
"github.com/pkg/errors"
"gitlab.com/wpetit/goweb/cqrs"
"gitlab.com/wpetit/goweb/middleware/container"
@ -51,7 +50,7 @@ func serveEmailPage(w http.ResponseWriter, r *http.Request) {
}
}
func serveEmailHTMLContent(w http.ResponseWriter, r *http.Request) {
func serveEmailContent(w http.ResponseWriter, r *http.Request) {
emailID, err := getEmailID(r)
if err != nil {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
@ -87,6 +86,41 @@ func serveEmailHTMLContent(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(sanitizedHTML))
}
func serveEmailHTMLContent(w http.ResponseWriter, r *http.Request) {
emailID, err := getEmailID(r)
if err != nil {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
ctx := r.Context()
email, err := openEmail(ctx, emailID)
if err != nil {
if errors.Is(err, storm.ErrNotFound) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
panic(errors.Wrap(err, "could not open email"))
}
html := email.HTML
if html == "" {
http.Error(w, http.StatusText(http.StatusNoContent), http.StatusNoContent)
return
}
sanitizedHTML := email.HTML
w.Header().Set("Content-Type", "text/html")
w.Write([]byte(sanitizedHTML))
}
func serveEmailAttachment(w http.ResponseWriter, r *http.Request) {
emailID, err := getEmailID(r)
if err != nil {

View File

@ -12,6 +12,7 @@ func Mount(r *chi.Mux, config *config.Config) error {
r.Get("/", serveInboxPage)
r.Delete("/emails", handleClearInbox)
r.Get("/emails/{id}", serveEmailPage)
r.Get("/emails/{id}/mail", serveEmailContent)
r.Get("/emails/{id}/html", serveEmailHTMLContent)
r.Get("/emails/{id}/attachments/{attachmendIndex}", serveEmailAttachment)
r.Delete("/emails/{id}", handleEmailDelete)