Make expiration mailer RFC 822 compliant (and satisfy SpamAssassin)

This commit is contained in:
Roland Shoemaker 2015-12-29 11:48:02 +00:00
parent fde3ff6d42
commit eb52f02d06
3 changed files with 28 additions and 6 deletions

View File

@ -19,6 +19,7 @@ import (
"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/codegangsta/cli"
"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/jmhodges/clock"
"github.com/letsencrypt/boulder/Godeps/_workspace/src/gopkg.in/gorp.v1"
"github.com/letsencrypt/boulder/cmd"
"github.com/letsencrypt/boulder/core"
blog "github.com/letsencrypt/boulder/log"
@ -72,7 +73,7 @@ func (m *mailer) sendNags(parsedCert *x509.Certificate, contacts []*core.AcmeURL
return err
}
startSending := m.clk.Now()
err = m.mailer.SendMail(emails, msgBuf.String())
err = m.mailer.SendMail(emails, "Certificate expiration notice", msgBuf.String())
if err != nil {
m.stats.Inc("Mailer.Expiration.Errors.SendingNag.SendFailure", 1, 1.0)
return err

View File

@ -50,7 +50,7 @@ func (m *mockMail) Clear() {
m.Messages = []string{}
}
func (m *mockMail) SendMail(to []string, msg string) (err error) {
func (m *mockMail) SendMail(to []string, subject, msg string) (err error) {
for range to {
m.Messages = append(m.Messages, msg)
}

View File

@ -6,13 +6,17 @@
package mail
import (
"fmt"
"math/rand"
"net"
"net/smtp"
"strings"
"time"
)
// Mailer provides the interface for a mailer
type Mailer interface {
SendMail([]string, string) error
SendMail([]string, string, string) error
}
// MailerImpl defines a mail transfer agent to use for sending mail
@ -35,9 +39,26 @@ func New(server, port, username, password string) MailerImpl {
}
}
func (m *MailerImpl) generateMessage(to []string, subject, body string) []byte {
now := time.Now().UTC()
headers := []string{
fmt.Sprintf("To: %s", strings.Join(to, ", ")),
fmt.Sprintf("From: %s", m.From),
fmt.Sprintf("Subject: %s", subject),
fmt.Sprintf("Date: %s", now.Format("Mon Jan 2 2006 15:04:05 -0700")),
fmt.Sprintf("Message-Id: <%s.%d.%s>", now.Format("20060102T150405"), rand.Int63(), m.From),
}
return []byte(fmt.Sprintf("%s\r\n\r\n%s\r\n", strings.Join(headers, "\r\n"), body))
}
// SendMail sends an email to the provided list of recipients. The email body
// is simple text.
func (m *MailerImpl) SendMail(to []string, msg string) (err error) {
err = smtp.SendMail(net.JoinHostPort(m.Server, m.Port), m.Auth, m.From, to, []byte(msg))
return
func (m *MailerImpl) SendMail(to []string, subject, msg string) error {
return smtp.SendMail(
net.JoinHostPort(m.Server, m.Port),
m.Auth,
m.From,
to,
m.generateMessage(to, subject, msg),
)
}