From d35a1c30f45d11d2e38ac848eb70c89f9a3cc524 Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Mon, 30 May 2016 10:18:49 +0200
Subject: [PATCH] Do not write HTML in text/plain mail part (#2954)

* Do not write HTML in text/plain mail part

Fixes #2928

* Pass text/plain first, text/html second

* Do not send plain/text email if html2text failed (untested)
---
 modules/mailer/mailer.go | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go
index e1c453a22..b43df4de4 100644
--- a/modules/mailer/mailer.go
+++ b/modules/mailer/mailer.go
@@ -18,6 +18,7 @@ import (
 
 	"github.com/gogits/gogs/modules/log"
 	"github.com/gogits/gogs/modules/setting"
+	"github.com/jaytaylor/html2text"
 )
 
 type Message struct {
@@ -26,14 +27,21 @@ type Message struct {
 }
 
 // NewMessageFrom creates new mail message object with custom From header.
-func NewMessageFrom(to []string, from, subject, body string) *Message {
+func NewMessageFrom(to []string, from, subject, htmlbody string) *Message {
 	msg := gomail.NewMessage()
 	msg.SetHeader("From", from)
 	msg.SetHeader("To", to...)
 	msg.SetHeader("Subject", subject)
 	msg.SetDateHeader("Date", time.Now())
-	msg.SetBody("text/plain", body)
-	msg.AddAlternative("text/html", body)
+	body, err := html2text.FromString(htmlbody)
+	if err != nil {
+		// TODO: report error ?
+		msg.SetBody("text/html", htmlbody)
+	} else {
+		msg.SetBody("text/plain", body)
+		// TODO: avoid this (use a configuration switch?)
+		msg.AddAlternative("text/html", htmlbody)
+	}
 
 	return &Message{
 		Message: msg,