1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 17:47:03 +00:00

Basic HTML email rendering

Messages with a MIME text/html MIME part will now be displayed with an
`HTML` button above them that will open another window and render the
HTML when clicked.

There is no sanitization performed, and inline attachment display is
not support.

This closes #2
This commit is contained in:
James Hillyerd
2012-10-17 21:47:48 -07:00
parent 0efb28ef38
commit 24dcd62951
5 changed files with 46 additions and 1 deletions

View File

@@ -3,6 +3,7 @@ package controllers
import (
"github.com/jhillyerd/inbucket/app/inbucket"
"github.com/robfig/revel"
"html/template"
)
type Mailbox struct {
@@ -69,9 +70,10 @@ func (c Mailbox) Show(name string, id string) rev.Result {
return c.RenderError(err)
}
body := mime.Text
htmlAvailable := mime.Html != ""
c.Response.Out.Header().Set("Expires", "-1")
return c.Render(name, message, body)
return c.Render(name, message, body, htmlAvailable)
}
func (c Mailbox) Delete(name string, id string) rev.Result {
@@ -97,9 +99,41 @@ func (c Mailbox) Delete(name string, id string) rev.Result {
if err != nil {
return c.RenderError(err)
}
c.Response.Out.Header().Set("Expires", "-1")
return c.RenderText("OK")
}
func (c Mailbox) Html(name string, id string) rev.Result {
c.Validation.Required(name).Message("Account name is required")
c.Validation.Required(id).Message("Message ID is required")
if c.Validation.HasErrors() {
c.Validation.Keep()
c.FlashParams()
return c.Redirect(Application.Index)
}
ds := inbucket.NewDataStore()
mb, err := ds.MailboxFor(name)
if err != nil {
return c.RenderError(err)
}
message, err := mb.GetMessage(id)
if err != nil {
return c.RenderError(err)
}
_, mime, err := message.ReadBody()
if err != nil {
return c.RenderError(err)
}
// Mark as safe to render HTML
// TODO: It is not really safe to render, need to sanitize.
body := template.HTML(mime.Html)
c.Response.Out.Header().Set("Expires", "-1")
return c.Render(name, message, body)
}
func (c Mailbox) Source(name string, id string) rev.Result {
c.Validation.Required(name).Message("Account name is required")
c.Validation.Required(id).Message("Message ID is required")

View File

@@ -0,0 +1 @@
{{.body}}

View File

@@ -44,6 +44,12 @@
})
}
function htmlView(id) {
window.open('/mailbox/html/{{$name}}/' + id, '_blank',
'width=800,height=600,' +
'menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=yes')
}
function messageSource(id) {
window.open('/mailbox/source/{{$name}}/' + id, '_blank',
'width=800,height=600,' +

View File

@@ -1,6 +1,9 @@
<div id="emailActions">
<a href="javascript:deleteMessage('{{.message.Id}}');">Delete</a>
<a href="javascript:messageSource('{{.message.Id}}');">Source</a>
{{if .htmlAvailable}}
<a href="javascript:htmlView('{{.message.Id}}');">HTML</a>
{{end}}
</div>
<table id="emailHeader">
<tr>

View File

@@ -8,6 +8,7 @@ GET /mailbox Mailbox.Index
GET /mailbox/list/{name} Mailbox.List
GET /mailbox/show/{name}/{id} Mailbox.Show
GET /mailbox/source/{name}/{id} Mailbox.Source
GET /mailbox/html/{name}/{id} Mailbox.Html
POST /mailbox/delete/{name}/{id} Mailbox.Delete
# Ignore favicon requests