minify email html before sending

This commit is contained in:
tsmethurst 2021-10-17 17:45:07 +02:00
commit d3a80b69f0
7 changed files with 31 additions and 9 deletions

View file

@ -21,6 +21,8 @@ package email
import (
"bytes"
"net/smtp"
"github.com/superseriousbusiness/gotosocial/internal/text"
)
const (
@ -33,7 +35,11 @@ func (s *sender) SendConfirmEmail(toAddress string, data ConfirmData) error {
if err := s.template.ExecuteTemplate(buf, confirmTemplate, data); err != nil {
return err
}
confirmBody := buf.String()
confirmBody, err := text.MinifyHTML(buf.String())
if err != nil {
return err
}
msg := assembleMessage(confirmSubject, confirmBody, toAddress, s.from)
return smtp.SendMail(s.hostAddress, s.auth, s.from, []string{toAddress}, msg)

View file

@ -21,6 +21,8 @@ package email
import (
"bytes"
"html/template"
"github.com/superseriousbusiness/gotosocial/internal/text"
)
// NewNoopSender returns a no-op email sender that will just execute the given sendCallback
@ -50,7 +52,11 @@ func (s *noopSender) SendConfirmEmail(toAddress string, data ConfirmData) error
if err := s.template.ExecuteTemplate(buf, confirmTemplate, data); err != nil {
return err
}
confirmBody := buf.String()
confirmBody, err := text.MinifyHTML(buf.String())
if err != nil {
return err
}
msg := assembleMessage(confirmSubject, confirmBody, toAddress, "test@example.org")
s.sendCallback(toAddress, string(msg))
@ -64,7 +70,11 @@ func (s *noopSender) SendResetEmail(toAddress string, data ResetData) error {
if err := s.template.ExecuteTemplate(buf, resetTemplate, data); err != nil {
return err
}
resetBody := buf.String()
resetBody, err := text.MinifyHTML(buf.String())
if err != nil {
return err
}
msg := assembleMessage(resetSubject, resetBody, toAddress, "test@example.org")
s.sendCallback(toAddress, string(msg))

View file

@ -21,6 +21,8 @@ package email
import (
"bytes"
"net/smtp"
"github.com/superseriousbusiness/gotosocial/internal/text"
)
const (
@ -33,7 +35,11 @@ func (s *sender) SendResetEmail(toAddress string, data ResetData) error {
if err := s.template.ExecuteTemplate(buf, resetTemplate, data); err != nil {
return err
}
resetBody := buf.String()
resetBody, err := text.MinifyHTML(buf.String())
if err != nil {
return err
}
msg := assembleMessage(resetSubject, resetBody, toAddress, s.from)
return smtp.SendMail(s.hostAddress, s.auth, s.from, []string{toAddress}, msg)

View file

@ -39,7 +39,7 @@ func (suite *UtilTestSuite) TestTemplateConfirm() {
suite.sender.SendConfirmEmail("user@example.org", confirmData)
suite.Len(suite.sentEmails, 1)
suite.Equal("Subject: GoToSocial Email Confirmation\r\nFrom: GoToSocial <test@example.org>\r\nTo: user@example.org\r\nMIME-version: 1.0;\nContent-Type: text/html;\r\n<!DOCTYPE html>\n<html>\n </head>\n <body>\n <div>\n <h1>\n Hello test!\n </h1>\n </div>\n <div>\n <p>\n You are receiving this mail because you've requested an account on <a href=\"https://example.org\">Test Instance</a>.\n </p>\n <p>\n We just need to confirm that this is your email address. To confirm your email, <a href=\"https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\">click here</a> or paste the following in your browser's address bar:\n </p>\n <p>\n <code>\n https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\n </code>\n </p>\n </div>\n <div>\n <p>\n If you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of <a href=\"https://example.org\">Test Instance</a>.\n </p>\n </div>\n </body>\n</html>\r\n", suite.sentEmails["user@example.org"])
suite.Equal("Subject: GoToSocial Email Confirmation\r\nFrom: GoToSocial <test@example.org>\r\nTo: user@example.org\r\nMIME-version: 1.0;\nContent-Type: text/html;\r\n<!doctype html><html></head><body><div><h1>Hello test!</h1></div><div><p>You are receiving this mail because you've requested an account on <a href=\"https://example.org\">Test Instance</a>.</p><p>We just need to confirm that this is your email address. To confirm your email, <a href=\"https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\">click here</a> or paste the following in your browser's address bar:</p><p><code>https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa</code></p></div><div><p>If you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of <a href=\"https://example.org\">Test Instance</a>.</p></div></body></html>\r\n", suite.sentEmails["user@example.org"])
}
func (suite *UtilTestSuite) TestTemplateReset() {
@ -52,7 +52,7 @@ func (suite *UtilTestSuite) TestTemplateReset() {
suite.sender.SendResetEmail("user@example.org", resetData)
suite.Len(suite.sentEmails, 1)
suite.Equal("Subject: GoToSocial Password Reset\r\nFrom: GoToSocial <test@example.org>\r\nTo: user@example.org\r\nMIME-version: 1.0;\nContent-Type: text/html;\r\n<!DOCTYPE html>\n<html>\n </head>\n <body>\n <div>\n <h1>\n Hello test!\n </h1>\n </div>\n <div>\n <p>\n You are receiving this mail because a password reset has been requested for your account on <a href=\"https://example.org\">Test Instance</a>.\n </p>\n <p>\n To reset your password, <a href=\"https://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\">click here</a> or paste the following in your browser's address bar:\n </p>\n <p>\n <code>\n https://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\n </code>\n </p>\n </div>\n <div>\n <p>\n If you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of <a href=\"https://example.org\">Test Instance</a>.\n </p>\n </div>\n </body>\n</html>\r\n", suite.sentEmails["user@example.org"])
suite.Equal("Subject: GoToSocial Password Reset\r\nFrom: GoToSocial <test@example.org>\r\nTo: user@example.org\r\nMIME-version: 1.0;\nContent-Type: text/html;\r\n<!doctype html><html></head><body><div><h1>Hello test!</h1></div><div><p>You are receiving this mail because a password reset has been requested for your account on <a href=\"https://example.org\">Test Instance</a>.</p><p>To reset your password, <a href=\"https://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\">click here</a> or paste the following in your browser's address bar:</p><p><code>https://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa</code></p></div><div><p>If you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of <a href=\"https://example.org\">Test Instance</a>.</p></div></body></html>\r\n", suite.sentEmails["user@example.org"])
}
func TestUtilTestSuite(t *testing.T) {

View file

@ -52,7 +52,7 @@ func postformat(in string) string {
s = html.UnescapeString(s)
// 3. minify html to remove any trailing newlines, spaces, unnecessary elements, etc etc
mini, err := minifyHTML(s)
mini, err := MinifyHTML(s)
if err != nil {
// if the minify failed, just return what we have
return s

View file

@ -25,8 +25,8 @@ import (
var m *minify.M
// minifyHTML runs html through a minifier, reducing it in size.
func minifyHTML(in string) (string, error) {
// MinifyHTML runs html through a minifier, reducing it in size.
func MinifyHTML(in string) (string, error) {
if m == nil {
m = minify.New()
m.Add("text/html", &html.Minifier{